【发布时间】:2014-10-29 12:57:25
【问题描述】:
当我想使用 XPath 遍历我的 XmlDocument 时,我发现文档中有很多丑陋的命名空间,所以我开始使用 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" 是默认命名空间,因为它位于根元素上。
所以,天真地,我这样配置了我的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) 是空命名空间。
这是为什么呢?而且,更重要的是:如果不使用前缀将它们设置为空的命名空间,我如何访问默认命名空间中的节点?
如果在搜索节点时我什至无法访问它,那么在管理器上设置默认命名空间有什么好处?
【问题讨论】:
-
"What good is..." - 你有没有想过
XmlNamespaceManager被更多的代码使用,而不是 just 将它用于 XPath 查询和在 那些 情况下,默认命名空间可能非常有用? -
可能重复:stackoverflow.com/questions/585812/…@Damien:不必粗鲁。
-
@LarsH - 这是一种修辞手法。很抱歉你觉得这很粗鲁,我经常用这种评论方式让人们质疑他们的假设,这是第一次有人断言这是粗鲁的。很抱歉给你造成了冒犯。
-
好评,因为;是的,它确实有。我不知道这个经理还有什么其他应用程序。
-
@Damien:感谢您对反馈持开放态度。
标签: c# .net xml xpath xml-namespaces