为什么将 xml 根作为 xpath 的一部分时我没有得到任何结果。
我在 XElement 上使用简单的 xpath "/rdf:RDF/channel"
(见下文)
我将所有命名空间添加到XmlNamespaceManager
,但我没有结果,就像xpathNavigator
已经在根目录中一样,所以它期望以 /channel
开头的路径。
代码:
const string rdfFile = @"C:\index.rdf";
var text = File.ReadAllText(rdfFile);
XmlReader reader = XmlReader.Create(new StringReader(text));
XElement doc = XElement.Load(reader);
XmlNameTable nameTable = reader.NameTable;
XmlNameTable table = nameTable ?? new NameTable();
var manager = new XmlNamespaceManager(table);
manager.AddNamespace(RDFNamespaceName, RDFNamespace);
manager.AddNamespace(RDFNamespaceName2, RDFNamespace2);
manager.AddNamespace(RDFNamespaceName3, RDFNamespace3);
manager.AddNamespace(RDFNamespaceName4, RDFNamespace4);
manager.AddNamespace(RDFNamespaceName5, RDFNamespace5);
manager.AddNamespace(RDFNamespaceName6, RDFNamespace6);
manager.AddNamespace(RDFNamespaceName7, RDFNamespace7);
var res = doc.XPathSelectElements(RDFXpath, manager);
private const string RDFXpath = "/rdf:RDF/channel";
private const string RDFNamespaceName = "rdf";
private const string RDFNamespace = @"http://www.w3.org/1999/02/22-rdf-syntax-ns#";
private const string RDFNamespaceName2 = "";
private const string RDFNamespace2 = @"http://purl.org/rss/1.0/";
private const string RDFNamespaceName3 = "cc";
private const string RDFNamespace3 = @"http://web.resource.org/cc/";
private const string RDFNamespaceName4 = "content";
private const string RDFNamespace4 = @"http://purl.org/rss/1.0/modules/content/";
private const string RDFNamespaceName5 = "admin";
private const string RDFNamespace5 = @"http://webns.net/mvcb/";
private const string RDFNamespaceName6 = "sy";
private const string RDFNamespace6 = @"http://purl.org/rss/1.0/modules/syndication/";
private const string RDFNamespaceName7 = "dc";
private const string RDFNamespace7 = @"http://purl.org/dc/elements/1.1/";
部分xml:
<?xml version="1.0" encoding="utf-8" ?>
- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:cc="http://web.resource.org/cc/" xmlns="http://purl.org/rss/1.0/">
- <channel rdf:about="http://blogs.charlotte.com/panthers/">
<title>Inside the Panthers</title>
...
最佳答案
您的“ channel ”节点全名是'http://purl.org/rss/1.0/':channel
。因此,您需要将带有任何(非空)前缀的两个 namespace 添加到您的 XPathManager 并在 XPath 中使用您的前缀(完全忽略 XML 中的前缀 - 它们与您的 XPath 无关):
private const string RDFXpath = "/rdf:RDF/prefix2:channel";
private const string RDFNamespaceName2 = "prefix2";
var res = doc.XPathSelectElements(RDFXpath, manager);
在 namespace 管理器中将“”(空字符串)指定为前缀不会对选择做任何有用的事情。 XPath 中的空前缀始终指向默认(空) namespace 。这与 XML 不同,在 XML 中,您可以使用影响当前节点和子节点的 xmlns="new_default_uri"
覆盖默认前缀。这包含在 XmlNamespaceManager.AddNamespace 的注释中.
关于c# - 为什么将 xml 根目录作为 xpath 的一部分时我没有得到任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13236942/