使用XPath在C#中解析XML文档

4

我正在尝试使用C#和System.XML解析以下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>

每篇关于XPath和命名空间的论文都告诉我要做以下事情:
XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable);
mgr.AddNamespace("n", "http://www.w3.org/1999/XSL/Transform");

在我添加上述代码后,查询。
xmlDoc.SelectNodes("/root/n:node", mgr);

程序可以正常运行,但没有返回任何结果。以下是代码:

xmlDoc.SelectNodes("/root/node", mgr);

如果我修改XML文件并删除命名空间,它会返回两个节点,因此似乎其他所有设置都正确。有什么想法为什么使用命名空间时它不起作用?

非常感谢!


这个答案也可能有帮助:http://stackoverflow.com/questions/4191084/linq-to-xml-problem-with-colon-in-the-xml-tags/8862051#8862051 - Nick Josevski
3个回答

7

如上所述,重要的是命名空间的URI,而不是前缀。

根据您的xml,您可以使用以下内容:

mgr.AddNamespace( "someOtherPrefix", "http://www.w3.org/TR/html4/" );
var nodes = xmlDoc.SelectNodes( "/root/someOtherPrefix:node", mgr );

这将为您提供所需的数据。一旦您掌握了这个概念,它就变得更容易,特别是当您处理默认命名空间(源xml中没有前缀)时,因为您可以立即知道您可以为每个URI分配一个前缀,并强烈引用文档中任何部分。

非常感谢。我从来没有想到过URI是如此重要的,尽管错过了这样一个明显的不一致还是有些愚蠢的。 - Vercinegetorix
是的,这并不是很直观,但现在你知道了,你就知道了。 - Steven Sudit

2
您在AddNamespace方法中指定的URI与xmlns声明中的不匹配。

1
如果您将前缀“n”声明为表示命名空间“http://www.w3.org/1999/XSL/Transform”,则在执行查询时节点不会匹配。这是因为,在您的文档中,前缀“n”指的是命名空间“http://www.w3.org/TR/html4/”。
请尝试使用mgr.AddNamespace("n", "http://www.w3.org/TR/html4/");代替。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接