2011-05-02 212 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方法,但可以隨時打開文件以讀爲普通文本,然後讀取到第一個節點,然後解析它,但是您喜歡。