簡體   English   中英

XML讀取子節點

[英]XML reading child nodes

我有一個XML文檔,我試圖獲取一個名為Unit的元素的子節點

我的XML Doc就像這樣布局:

<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,而是顯示所有項目而不是我選擇的項目。

正如我從你的xml和代碼中看到的那樣。 你有錯誤:

 xmlnode = xmldoc.GetElementsByTagName("Units");

改變它:

 xmlnode = xmldoc.GetElementsByTagName("Unit");

使用Linq to 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);

元素名稱中有拼寫錯誤:應該是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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM