2011-05-02 201 views
2

我想使用XPath查询来选择xml文档的根节点的所有子节点。如何在根节点有属性时选择xml根节点?

我的XML文件看起来像如下:

<?xml version="1.0" encoding="UTF-8" ?> 
<root> 
    <automotive_industry> 
     <automotive /> 
     <rail_global_services /> 
    </automotive_industry> 
</root> 

<?xml version="1.0" encoding="UTF-8" ?> 
<root xmlns="http://www.my_department.my_company.com/project_name"> 
    <automotive_industry> 
     <automotive /> 
     <rail_global_services /> 
    </automotive_industry> 
    </root> 

C#代码选择根节点如下:

XmlDocument gazetteDocument = new XmlDocument(); 
gazetteDocument.Load(xmlFilePath); 
XmlNodeList allNodes = gazetteDocument.SelectNodes("root"); 

此代码工作正常,它当根节点没有任何属性时,选择根节点的所有子节点,它适用于第1个xml fi但第二个xml文件不起作用,因为第二个文件具有xmlns属性。

有没有人知道当根节点有属性时如何选择根节点的所有子节点?

编辑: 我发现一个XPath查询:/*此查询选择根节点不管是否有任何属性或没有。一旦选择了根节点,我就可以遍历其所有的子节点。

+0

[在C#中使用带有默认名称空间的Xpath]的可能的重复(http://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c) – 2011-05-02 17:53:54

回答

3

虽然XML文档中的名称空间很好,但您需要在您的SelectNodes中使用它。 使用此代码,你的第二个XML:

XmlDocument gazetteDocument = new XmlDocument(); 
gazetteDocument.Load(xmlFilePath); 
XmlNamespaceManager nsmgr = new XmlNamespaceManager(gazetteDocument.NameTable); 
nsmgr.AddNamespace("ns", "http://www.my_department.my_company.com/project_name"); 
XmlNodeList allNodes = gazetteDocument.SelectNodes("ns:root", nsmgr); 

更好的方法是使用XDocument和相应的类。他们更容易合作。

+1

感谢您的帮助。我们仍然在.net 2.0框架时代,所以我不认为我可以使用XDocument。我试着改用你的其他解决方案。 – Shekhar 2011-05-02 11:18:15

+0

你说得对,你不能在.NET 2.0中使用'XDocument'。 – 2011-05-02 11:19:18

0

我不知道C#的旧xml方法,但可以随时打开文件以读为普通文本,然后读取到第一个节点,然后解析它,但是您喜欢。