0

こんにちは。XMLファイルを連絡先のリストに解析しようとしていますが、問題があります。

    public List<ContactModel> GetContacts()
    {

        var doc = XDocument.Load(HttpContext.Current
                                            .Server
                                            .MapPath(@"..\App_Data\Contacts.xml"));

        var result = from items in doc.Descendants("Directory")
                     select new ContactModel()
                                {
                                    Id = items.Attribute("ID").Value,
                                    FirstName = items.Attribute("FirstName").Value,
                                    LastName = items.Attribute("LastName").Value,
                                    Telephone = items.Attribute("Telephone").Value,
                                    Email = items.Attribute("Email").Value,
                                    Room = items.Attribute("Room").Value,
                                    Building = items.Attribute("Building").Value,
                                    Location = items.Attribute("Location").Value
                                };

        List<ContactModel> contactList = new List<ContactModel>();
        foreach (var item in result)
        {
            contactList.Add(item);
        }

        return contactList;
    }

ループしようとするとnull例外が発生しますが、何が間違っているのでしょうか。

これは私のXMLです

<?xml version="1.0" standalone="yes"?>
<ContactDirectory>
  <Directory>
    <ID>1</ID>
    <FirstName>Peter</FirstName>
    <LastName>Sutt</LastName>
    <Telephone>777888</Telephone>
    <Email>pett@gmail.com</Email>
    <Room>3.44</Room>
    <Building>Westside</Building>
    <Location>Leeds</Location>
  </Directory>
  <Directory>
    <ID>2</ID>
    <FirstName>Fred</FirstName>
    <LastName>West</LastName>
    <Telephone>1234</Telephone>
    <Email>fred@west.com</Email>
    <Room>1.23</Room>
    <Building>Cromwell St</Building>
    <Location>Gloster</Location>
  </Directory>
  <Directory>
</ContactDirectory>
4

3 に答える 3

3

Beebul、彼らはElementsではありませAttribute

var contactList = (from items in doc.Descendants("Directory")
                select new ContactModel()
                {
                    Id = items.Element("ID").Value,
                    FirstName = items.Element("FirstName").Value,
                    LastName = items.Element("LastName").Value,
                    Telephone = items.Element("Telephone").Value,
                    Email = items.Element("Email").Value,
                    Room = items.Element("Room").Value,
                    Building = items.Element("Building").Value,
                    Location = items.Element("Location").Value
                })
                .ToList();

resultPS:リストを取得するためにループする必要はありません。使用できますToList()

于 2012-10-02T11:46:35.063 に答える
2

1つ以上の属性が欠落しているようです。items.Attribute(...)を返しnull、それを呼び出すとValueNPE *が発生します。

実行は延期されるため、ループを開始するまで呼び出しは発生しませんresult

問題の原因となる属性を見つけるには、をAttribute(...)除くすべての呼び出しを削除IDし、クラッシュが発生しないことを確認し、クラッシュが再発するまで属性を1つずつ追加し始めます。


*質問に追加したXMLを確認した後、すべての属性が欠落しているようです。違いについて説明している短い記事へのリンクは次のとおりです。

于 2012-10-02T11:32:03.480 に答える
0

LinqからXMLへのAPIには、.Valueから返される可能性のあるnull参照を支援するための暗黙的な変換があります。のようなものを試してください(string) items.Attribute("Room")

于 2012-10-02T11:49:03.903 に答える