3

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

我在"/rdf:RDF/channel"XElement 上使用了一个简单的 xpath(见下文)

我将所有命名空间添加到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> 

...
4

2 回答 2

1

您的“频道”节点全名为'http://purl.org/rss/1.0/':channel. 因此,您需要将带有任何(非空)前缀的两个名称空间添加到您的 XPathManager 并在 XPath 中使用您的前缀(完全忽略 XML 中的前缀 - 它们与您的 XPath 无关):

private const string RDFXpath = "/rdf:RDF/prefix2:channel";
private const string RDFNamespaceName2 = "prefix2";
var res = doc.XPathSelectElements(RDFXpath, manager);

在命名空间管理器中指定“”(空字符串)作为前缀对选择没有任何用处。XPath 中的空前缀始终指向默认(空)命名空间。这与 XML 不同,您可以通过使用xmlns="new_default_uri"影响当前节点和子节点来覆盖默认前缀。这在XmlNamespaceManager.AddNamespace的注释中有所介绍。

于 2012-11-05T17:55:25.027 回答
0

似乎问题(除了 Alexei 发现的问题之外)是由于 XElement 和 XDocument 之间关于 Root 的差异,如果我使用 XDocument,我使用的 xpath 有效,但如果我使用 XElement,则无效,请参阅:

http://msdn.microsoft.com/en-us/library/bb675196.aspx

于 2012-11-05T20:47:00.140 回答