所以我试图用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文件并删除命名空间,返回两个节点,因此似乎其他所有内容都已正确设置。任何想法它的工作原理都没有命名空间吗?
非常感谢!
答案 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/");
。