所以我试图使用System.XML用C#解析以下XML文档:
<root xmlns:n="http://www.w3.org/TR/html4/">
<n:node>
<n:node>
data
</n:node>
</n:node>
<n:node>
<n:node>
data
</n:node>
</n:node>
</root>
Run Code Online (Sandbox Code Playgroud)
每个带有命名空间的XPath论文都告诉我要做以下事情:
XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
mgr.AddNamespace("n", "http://www.w3.org/1999/XSL/Transform");
Run Code Online (Sandbox Code Playgroud)
在我添加上面的代码后,查询
xmlDoc.SelectNodes("/root/n:node", mgr);
Run Code Online (Sandbox Code Playgroud)
运行良好,但什么都不返回.下列:
xmlDoc.SelectNodes("/root/node", mgr);
Run Code Online (Sandbox Code Playgroud)
如果我修改XML文件并删除名称空间,则返回两个节点,因此似乎其他所有内容都已正确设置.任何想法为什么它不起作用的命名空间?
非常感谢!
如上所述,它是重要的命名空间的URI,而不是前缀.
鉴于您的xml,您可以使用以下内容:
mgr.AddNamespace( "someOtherPrefix", "http://www.w3.org/TR/html4/" );
var nodes = xmlDoc.SelectNodes( "/root/someOtherPrefix:node", mgr );
Run Code Online (Sandbox Code Playgroud)
这将为您提供所需的数据.一旦你掌握了这个概念就变得容易了,特别是当你到达默认命名空间(源xml中没有前缀)时,因为你立即知道你可以为每个URI分配一个前缀并强烈引用你喜欢的文档的任何部分.