使用XPath,C#解析XML文档

时间:2009-09-02 05:00:57

标签: c# xml xpath

所以我试图用C#解析下面的XML文档,使用System.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文件并删除命名空间,

返回两个节点,因此似乎其他所有内容都已正确设置。任何想法它的工作原理都没有命名空间吗?

非常感谢!

3 个答案:

答案 0 :(得分:6)

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

鉴于您的xml,您可以使用以下内容:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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/");