c# - 为什么将 xml 根目录作为 xpath 的一部分时我没有得到任何结果

标签 c# xpath xelement

为什么将 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/

相关文章:

sql - XQuery [nodes()] : Syntax error near '<eof>' , 需要一个步骤表达式

r - R,右xpath使用xpathSApply抓取文本

.net - 获取 XElement 的 InnerXml 的最佳方法?

c# - 使用 XElement 的方法 Elements(XName) 的 Linq To Xml 问题

c# - ASP.NET MVC 查询的通用处理程序

c# - Unity的Mesh.CombineMeshes()似乎删除了顶点信息

javascript - 如何使用 document.evaluate() 和 XPath 获取元素列表?

c# - 如何将子元素作为解码字符串添加到 XElement?

c# - Linq/C# 从联结表中获取信息

c# - 将不同的模型类型从 Controller 传递到 View 是好的做法吗?