XML读取子节点

9

我有一个XML文档,想获取名为Unit的元素的子节点。

我的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);
    }
}

但问题是,当我尝试获取它们时,它显示所有项目而不是我选择的项目,而不是获取第一个项目或第二个项目。


2
当你需要 Unit 元素时,为什么要访问 Units 元素? - banana
我猜你的问题已经得到了回答...所以我想告诉你,你也可以使用LIQU转换为XML。 - ebram khalil
3个回答

15

从您的xml和代码中,我可以看到您在这行中存在错误:

 xmlnode = xmldoc.GetElementsByTagName("Units");

在这里进行更改:

 xmlnode = xmldoc.GetElementsByTagName("Unit");

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

顺便说一句,谢谢你,这样做容易多了。 - Ben

5

你在元素名称中打了一个错字:应该是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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接