2013-02-17 96 views
4

我有一個XML文件,我試圖讓一個元素的的childNodes稱爲UnitXML閱讀子節點

我的XML文檔中奠定了像這樣:

<Unit> 
    <id>3</id> 
    <name>System Information</name> 
    <description>null</description> 
    ... other ... 
</Unit> 

這是我的代碼我正在嘗試閱讀它們。

public void Load() 
{ 
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); 
    XmlDocument xmldoc = new XmlDocument(); 
    XmlNodeList xmlnode; 

    xmldoc.Load(fs); 
    xmlnode = xmldoc.GetElementsByTagName("Units"); 

    for (int i = 0; i < xmlnode.Count; i++) 
    { 
     string str = string.Format("ID: {0}\r\nName:{0}", xmlnode[i].ChildNodes.Item(0).InnerText, xmlnode[i].ChildNodes.Item(1).InnerText); 
     MessageBox.Show(str); 
    } 
} 

但問題是,當我試圖讓他們,而不是讓0項或1項,它會顯示所有的項目,而不是我選擇的項目。

+0

爲什麼你訪問元素'Units'當你需要'Unit'? – banana 2013-02-17 10:28:14

+0

我想你的問題已經得到解答......所以我只想告訴你,你也可以使用LIQU來XML。 – 2013-02-17 10:40:00

回答

8

正如我可以從你的XML和代碼看到的。你有錯誤行:

xmlnode = xmldoc.GetElementsByTagName("Units"); 

改變它:

xmlnode = xmldoc.GetElementsByTagName("Unit"); 
4

你必須在元素名稱拼寫錯誤:應該是Unit而不是Units

但是,您是否嘗試過使用LINQ to XML而不是XmlDocument

public void Load() 
{ 
    var doc = XDocument.Load(filePath); 

    foreach(var unit in doc.Descendants("Unit")) 
    { 
     string str = string.Format("ID: {0}\r\nName:{0}", unit.Element("id").Value, unit.Element("name").Value); 
     MessageBox.Show(str); 
    } 
} 
6

使用LINQ到XML,你可以輕鬆地分析你的XML轉換(匿名)強類型對象:

public void Load() 
{ 
    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); 

    var xdoc = XDocument.Load(fs); 
    var units = from u in xdoc.Descendants("Unit") 
       select new { 
        Id = (int)u.Element("id"), 
        Name = (string)u.Element("name") 
       }; 

    foreach(var unit in units) 
    { 
     // thanks God for IntelliSense! 
     MessageBox.Show(String.Format("ID:{0}\r\nName:{1}", unit.Id, unit.Name)); 
    } 
} 

嗯,其實如果你只需要顯示在消息框中的值,你甚至可以將所有代碼寫入一行。但我更喜歡第一種方法,檢索數據並顯示它們是分開的(最好是在單獨的方法)時:

XDocument.Load(filePath) 
     .Descendants("Unit") 
     .Select(u => String.Format("Id:{0}\nName:{1}", (int)u.Element("id"), (string)u.Element("name")) 
     .ToList() 
     .ForEach(MessageBox.Show); 
+1

最簡單的回答 – 2013-02-17 10:40:30

+0

順便說一句,這很容易 – ben 2013-02-17 13:50:13