2009-10-02 59 views
1

在.NET中我這樣做:淨Nametable空間(namespace)問題

XmlNamespaceManager nsMan = new XmlNamespaceManager(xmlDoc.NameTable); 
XmlNodeList nlImages = xmlDoc.SelectNodes("//v:imagedata", nsMan); 

我得到這個異常:

Namespace prefix 'v' is not defined. 

但是,如果我打破的過程,寫這樣的說法:

xmlDoc.NameTable.Get("v") 

我得到「v」out,所以命名空間被定義...對嗎?

總之,爲了得到這個工作,我必須補充一點:

nsMan.AddNamespace("v", "urn:schemas-microsoft-com:vml"); 

要獲得的XPath查詢工作(我檢查和V命名空間的源XML文檔中定義),所以爲什麼這不工作,因爲它似乎應該?

感謝您的幫助,

-nomad311

回答

1

這是怎樣的XmlNode對象的作品的怪癖,並在XML文檔中訪問的命名空間。

不幸的是,您必須使用XmlNamespaceManager(正如您在您的問題中發佈的代碼中所做的那樣)才能在您正在處理的XML文檔中使用名稱空間。

MSDN documentation for the .SelectNodes method of the XmlNode object

XPath表達式可以包括 命名空間。名稱空間分辨率爲 ,使用 XmlNamespaceManager支持。如果XPath 表達式包含前綴,則 前綴和名稱空間URI對必須被添加到XmlNamespaceManager中 。

注:

如果XPath表達式不 包括前綴,假定 命名空間URI是空 命名空間。如果您的XML包含 默認名稱空間,則仍然必須將 前綴和名稱空間URI添加到 XmlNamespaceManager;否則,你 將不會得到任何選擇的節點。有關 的更多信息,請參閱Select Nodes Using XPath Navigation

值得一提的是,使用LINQ-To-XML處理XML文檔/節點要容易得多,而且更「流利」。