Запрос LINQ to XML и метод расширения, который преобразует документ XML в документ XDocument - PullRequest
2 голосов
/ 23 июня 2011

Вот мой XML-документ, который передается в метод CreateListOfAddresses():

<?xml version="1.0"?>
    <AddressValidateResponse>
        <Address ID="0">
        <Address2>8 WILDWOOD DR</Address2>
        <City>OLD LYME</City>
        <State>CT</State>
        <Zip5>06371</Zip5>
        <Zip4>1844</Zip4>
    </Address>
</AddressValidateResponse>

Вот мой метод:

    private List<AddressBlockResponse> CreateListOfAddresses(XmlDocument xmlDoc)
    {
        // Convert XML document to xdocument so we can use LINQ.
        XDocument xDoc = xmlDoc.ToXDocument();

        var address = from a in xDoc.Descendants("AddressValidateResponse")
                      select new AddressBlockResponse
                      {
                          Order = int.Parse(a.Attribute("ID").Value),
                          AddressLine2 = a.Element("Address2").Value,
                          City = a.Element("City").Value,
                          State = a.Element("State").Value,
                          ZipCode = a.Element("Zip5").Value,
                          ZipPlus4 = a.Element("Zip4").Value
                      };
        return address.ToList();
    }

Вот метод расширения, который преобразует мой XMLдокумент для типа XDocument:

public static XDocument ToXDocument(this XmlDocument xmlDocument)
{
    using (var nodeReader = new XmlNodeReader(xmlDocument))
    {
        nodeReader.MoveToContent();
        return XDocument.Load(nodeReader);
    }
}

Вот мой объект:

[Serializable]
public struct AddressBlockResponse
{
    // Standardized address returned from the service
    [DataMember(IsRequired = true)]
    public int Order;

    [DataMember(IsRequired = true)]
    public string AddressLine1;

    [DataMember(IsRequired = false)]
    public string AddressLine2;

    [DataMember(IsRequired = true)]
    public string City;

    [DataMember(IsRequired = true)]
    public string State;

    [DataMember(IsRequired = true)]
    public string ZipCode;

    [DataMember(IsRequired = true)]
    public string ZipPlus4;
}

Вот моя проблема: метод CreateListOfAddresses () возвращает

Перечислениерезультатов не дал

Что я делаю не так?

1 Ответ

0 голосов
/ 23 июня 2011

Похоже, ваша проблема в том, что AddressValidateResponse является корневым узлом вашего документа.

Вы должны изменить его на:

var address = from a in xDoc.Descendants("Address")
                  select new AddressBlockResponse
                  {
                      // stuff
                  };

Также, когда вы используете такие элементы, как

City = a.Element("City").Value,

Вы должны сделать:потому что, если элемент не существует, ваша программа выдаст исключение нулевой ссылки.Я знаю, что у вас, вероятно, всегда будут эти xml-узлы, но я думаю, что это просто хорошая привычка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...