5

form_load イベントで実行されるメソッドがあり、1 行を省略しても正しく動作しているようです。

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 のアドバイスに従って、存在しない ChildNode を参照しようとしていたので、PersonTag.FirstChild.Value を変更しました。

更新された作業方法:

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;
}
4

3 に答える 3

2

例外に遭遇しただけではありませんか?ロジックを try/catch でラップし、ヒットするかどうかを確認します。

このような行は null 参照例外を引き起こす可能性があり、そのコード行にヒットしない理由である可能性があります。

PersonTag.FirstChild.Value

Employee、FirstName、または LastName の FirstChild で呼び出すと、子ノードが含まれていないため、null が返されると思います。

おそらく試してみてください:

PersonTag.InnerText
于 2012-12-13T22:09:04.123 に答える
2

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);
}
于 2012-12-13T22:11:01.043 に答える
0

Build -> Rebuild Solution?

時々役立つことが知られています。

多分:Debug -> Exceptions... -> Thrown

于 2012-12-13T22:24:31.073 に答える