2012-11-05 113 views
3

为什么将xml根包含在xpath中时我得不到任何结果。为什么包含xml根作为xpath的一部分我得不到结果

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

,我将所有的命名空间XmlNamespaceManager,但我得到没有结果,它就像xpathNavigator已经在根这样它预计的路径始于/channel

代码:将XML的

 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 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> 

... 

回答

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的注释中进行了介绍。

+0

感谢您的快速反应,不幸的是我仍然没有结果。 – uril

相关问题