2009-10-02 62 views
1

在.NET中我这样做:净Nametable空间(namespace)问题

XmlNamespaceManager nsMan = new XmlNamespaceManager(xmlDoc.NameTable); 
XmlNodeList nlImages = xmlDoc.SelectNodes("//v:imagedata", nsMan); 

我得到这个异常:

Namespace prefix 'v' is not defined. 

但是,如果我打破的过程,写这样的说法:

xmlDoc.NameTable.Get("v") 

我得到“v”out,所以命名空间被定义...对吗?

总之,为了得到这个工作,我必须补充一点:

nsMan.AddNamespace("v", "urn:schemas-microsoft-com:vml"); 

要获得的XPath查询工作(我检查和V命名空间的源XML文档中定义),所以为什么这不工作,因为它似乎应该?

感谢您的帮助,

-nomad311

回答

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