在.Net中我这样做:
XmlNamespaceManager nsMan = new XmlNamespaceManager(xmlDoc.NameTable);
XmlNodeList nlImages = xmlDoc.SelectNodes("//v:imagedata", nsMan);
我得到了这个例外:
Namespace prefix 'v' is not defined.
但如果我打破这个过程并写下这句话:
xmlDoc.NameTable.Get("v")
我得到“v”,所以名称空间被定义了......对吗?
无论如何,为了让这个工作,我必须添加:
nsMan.AddNamespace("v", "urn:schemas-microsoft-com:vml");
要使XPath查询起作用(我检查过,并且在源xml文档中定义了v名称空间),那么为什么它不能正常工作呢?
感谢帮助,
-nomad311
答案 0 :(得分: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文档/节点要容易得多,而且“更流畅”。