2009-09-02 104 views
4

所以我试图解析与C#下面的XML文档,使用了System.XML:解析XML文档,C#

<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

这个答案可能也有帮助:http://stackoverflow.com/questions/4191084/linq-to-xml-problem-with-colon-in-the-xml-tags/8862051#8862051 – 2012-01-14 11:56:54

回答

6

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

鉴于你的XML,你可以使用以下命令:

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

这会给你想要的数据。一旦你掌握了这个概念,就会变得更加容易,特别是当你进入默认命名空间(源xml中没有前缀)时,因为你立即知道你可以为每个URI分配一个前缀并强烈引用你喜欢的文档的任何部分。

+0

非常感谢。我从来没有想到这是一个很重要的URI,虽然我很怀念这种明显的不一致性。 – Vercinegetorix 2009-09-02 18:04:47

+0

是的,这不是很直观,但现在你知道它,你知道它。 – 2009-09-03 01:35:28

2

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

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/");