当我想使用XPath遍历我的XmlDocument时,出现了一个问题,即文档中有很多丑陋的 namespace ,因此我开始将NamespaceManager
与XPath一起使用。
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"
是默认 namespace ,因为它位于根元素上。因此,天真地,我像这样配置了
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))
我从来没有得到任何结果。我的印象是,通过将第一个 namespace 设置为空前缀,在该工作空间中搜索节点时无需设置该 namespace 。
但是,因为它是stated on the
AddNamespace
method:这是为什么?而且,更重要的是:如果不使用前缀,如何访问默认 namespace 中的节点,将其设置为空 namespace ?
如果在搜索节点时甚至无法访问默认 namespace ,则在管理器上设置默认 namespace 有什么好处?
最佳答案
@JLRishe的答案对于访问默认 namespace 中的节点是正确的(即,始终将前缀映射到XmlNamespaceManager
中的默认 namespace )。
从您的引号(MSDN XmlNamespaceManager.AddNamespace)中读取链接的整个上下文,即表示XPath表达式中未使用默认的“空”前缀。