2012-11-05 33 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

相關問題