2009-09-02 262 views
4

所以我試圖解析與C#下面的XML文檔,使用了System.XML:解析XML文檔,C#

<root xmlns:n="http://www.w3.org/TR/html4/"> 
<n:node> 
    <n:node> 
    data 
    </n:node> 
</n:node> 
<n:node> 
    <n:node> 
    data 
    </n:node> 
</n:node> 
</root> 

的XPath名稱空間的每個論述告訴我做到以下幾點:

XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable); 
mgr.AddNamespace("n", "http://www.w3.org/1999/XSL/Transform"); 

後,我添加上面的代碼,查詢

xmlDoc.SelectNodes("/root/n:node", mgr); 

運行良好,但沒有返回。以下:

xmlDoc.SelectNodes("/root/node", mgr); 

返回兩個節點,如果我修改XML文件並刪除命名空間,所以它似乎一切設置正確。任何想法爲什麼它的工作不與名稱空間?

非常感謝!

+0

這個答案可能也有幫助:http://stackoverflow.com/questions/4191084/linq-to-xml-problem-with-colon-in-the-xml-tags/8862051#8862051 – 2012-01-14 11:56:54

回答

6

如上所述,它是名稱空間的URI,它是重要的,而不是前綴。

鑑於你的XML,你可以使用以下命令:

mgr.AddNamespace("someOtherPrefix", "http://www.w3.org/TR/html4/"); 
var nodes = xmlDoc.SelectNodes("/root/someOtherPrefix:node", mgr); 

這會給你想要的數據。一旦你掌握了這個概念,就會變得更加容易,特別是當你進入默認命名空間(源xml中沒有前綴)時,因爲你立即知道你可以爲每個URI分配一個前綴並強烈引用你喜歡的文檔的任何部分。

+0

非常感謝。我從來沒有想到這是一個很重要的URI,雖然我很懷念這種明顯的不一致性。 – Vercinegetorix 2009-09-02 18:04:47

+0

是的,這不是很直觀,但現在你知道它,你知道它。 – 2009-09-03 01:35:28

2

您在AddNamespace方法中指定的URI與xmlns聲明中指定的URI不匹配。

1

如果聲明前綴「n」來表示命名空間「http://www.w3.org/1999/XSL/Transform」,那麼當您執行查詢時節點將不匹配。這是因爲在您的文檔中,前綴「n」指的是名稱空間「http://www.w3.org/TR/html4/」。

改爲嘗試使用mgr.AddNamespace("n", "http://www.w3.org/TR/html4/");