c# - 嵌套的 foreach 循环读取 .xml 并将对象写入列表

标签 c# xml debugging foreach

我有一个在 form_load 事件上执行的方法,似乎可以正常工作,省略一行。

private int ReadInPeople()
{
    XmlNodeList nodeList = m_xmlDoc.DocumentElement.ChildNodes;
    foreach (XmlNode PersonNode in nodeList)
    {
        Employee ccontact = new Employee();
        foreach (XmlNode PersonTag in PersonNode.ChildNodes)
        {
            switch (PersonTag.Name)
            {
                case "Employee":
                    ccontact.EmployeeNumber = PersonTag.FirstChild.Value;
                    break;
                case "FirstName":
                    ccontact.FirstName = PersonTag.FirstChild.Value;
                    break;
                case "LastName":
                    ccontact.LastName = PersonTag.FirstChild.Value;
                    break;
                default:
                    break;
            }
        }
        this.AddContact(ccontact);
    }
    return nodeList.Count;
}

AddContact 方法将 Employee 对象添加到静态列表;但是,行:

this.AddContact(ccontact);

没有被执行。

XML 文件示例:

<?xml version="1.0" encoding="utf-8"?>
<people>
  <person>
    <Employee>123456789</Employee>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
  </person>
  <person>
    <Employee>987654321</Employee>
    <FirstName>Ellen</FirstName>
    <LastName>Wayne</LastName>
  </person>
</people>

我试过设置断点和调试,果然,这一行被完全跳过了,就好像它根本不存在一样。

根据 Alan 的建议,我更改了 PersonTag.FirstChild.Value,因为它试图引用不存在的 ChildNode。

更新后的工作方法:

private int ReadInPeople()
{
    XmlNodeList nodeList = m_xmlDoc.DocumentElement.ChildNodes;
    foreach (XmlNode PersonNode in nodeList)
    {
        Employee ccontact = new Employee();
        foreach (XmlNode PersonTag in PersonNode.ChildNodes)
        {
            switch (PersonTag.Name)
            {
                case "Employee":
                    ccontact.EmployeeNumber = PersonTag.InnerText;
                    break;
                case "FirstName":
                    ccontact.FirstName = PersonTag.InnerText;
                    break;
                case "LastName":
                    ccontact.LastName = PersonTag.InnerText;
                    break;
                default:
                    break;
            }
        }
        this.AddContact(ccontact);
    }
    return nodeList.Count;
}

最佳答案

您可以使用 LINQ to XML 轻松解析您的 xml:

XDocument xdoc = XDocument.Load(path_to_xml);   
var employees = xdoc.Descendants("person")
                    .Select(p => new Employee()
                    {
                        FirstName = (string)p.Element("FirstName"),
                        LastName = (string)p.Element("LastName"),
                        EmployeeNumber = (long)p.Element("Employee")
                    });

foreach (var ccontact in employees)
    this.AddContact(ccontact);

XmlDocument解决方案:

XmlNodeList nodeList = m_xmlDoc.DocumentElement.SelectNodes("person");
foreach (XmlNode PersonNode in nodeList)
{
    Employee ccontact = new Employee();
    ccontact.LastName = PersonNode["LastName"].InnerText;
    ccontact.FirstName = PersonNode["FirstName"].InnerText;
    ccontact.EmployeeNumber = PersonNode["Employee"].InnerText;
    this.AddContact(ccontact);
}

关于c# - 嵌套的 foreach 循环读取 .xml 并将对象写入列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868847/

相关文章:

作为 PHP 开发人员调试 Phalcon

asp.net-mvc - MVC CDN bundle 在调试中不使用本地副本

c# - LINQ - 字符串包含数组中的任何元素

c# - 在高容量 IIS 网站上运行时 Entity Framework 会失败吗

xml - Base64 XML 二进制内容

c# - 将 XML 传递给 Web 服务的最佳方法?

java - 使用 XPath 检索 XML 元素

WCF DataContract 的 C# 类结构

c# - 如何从匿名列表中删除项目

c - 在 C 中调试直方图