.Net Nametable(命名空间)问题

时间:2009-10-02 14:55:38

标签: .net xml namespaces

在.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

1 个答案:

答案 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文档/节点要容易得多,而且“更流畅”。