當我想使用XPath遍歷我的XmlDocument時,我遇到了文檔中存在許多醜陋命名空間的問題,因此我開始使用NamespaceManager
以及XPath 。爲什麼在XPath中使用無前綴時NamespaceManager不使用DefaultNamespace
的XML看起來像這樣
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet ss:Name="KA0100401">
<Table>
<Row>
<Cell>Data</Cell>
</Row>
<!-- more rows... -->
</Table>
</Worksheet>
<Worksheet ss:Name="KA0100402">
<!-- .... --->
</Worksheet>
</Workbook>
現在,從我從這份文件看,"urn:schemas-microsoft-com:office:spreadsheet"
是默認的命名空間,因爲它所在的根元素。
所以,天真,我配置了我NamespaceManager
這樣的:
XmlDocument document = new XmlDocument();
document.Load(reader);
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace(String.Empty, "urn:schemas-microsoft-com:office:spreadsheet");
manager.AddNamespace("o", "urn:schemas-microsoft-com:office:office");
manager.AddNamespace("x", "urn:schemas-microsoft-com:office:excel");
manager.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");
manager.AddNamespace("html", "http://www.w3.org/TR/REC-html40");
但是,當我嘗試訪問節點
foreach (XmlNode row in document.SelectNodes("/Workbook/Worksheet[1]/Table/Row", manager))
我從來沒有得到任何結果。我的印象是,通過將第一個名稱空間設置爲空前綴,我不需要在該工作空間中搜索節點時設置它。
但是,因爲它是stated on the AddNamespace
method:
如果XPath表達式不包括一個前綴,假定命名空間統一資源標識符(URI)是空的命名空間。
這是爲什麼?而且,更重要的是:如何在默認名稱空間中訪問節點,如果不使用前綴將它們設置爲空名稱空間?
如果在搜索節點時甚至無法訪問管理器,那麼在管理器上設置默認名稱空間有什麼好處?
「有什麼好處?」 - 有它沒有想到你該'XmlNamespaceManager'所使用的多段代碼*只是使用它的XPath查詢和* *這些情況下默認的命名空間*可能是完全有用的比? – 2014-10-29 14:16:28
可能重複:http://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c-sharp @Damien:無需是不禮貌的。 – LarsH 2014-10-29 14:51:26
@LarsH - 這是一種修辭手段。我對不起你認爲這是不禮貌的,我經常使用註釋這種風格讓人質疑他們的假設,這是第一次有人曾斷言,這是不禮貌的。對不起,這引起了你的進攻。 – 2014-10-29 15:06:22