XML to LINQ - получение коллекции значений узла, упорядоченной по значению другого элемента - PullRequest
0 голосов
/ 03 октября 2019

У меня есть следующий XML, мне нужно только получить значение узла Id, но мне нужно получить их по порядку по DatePaid узлу

<Payment>
    <Id>47398</Id>
    <DatePaid>09/01/2019 10:44:08</DatePaid>
</Payment>
<Payment>
    <Id>63523</Id>
    <DatePaid>09/07/2019 10:04:02</DatePaid>
</Payment>
<Payment>
    <Id>94902</Id>
    <DatePaid>09/05/2019 10:32:09</DatePaid>
</Payment>

Таким образом, результирующий список будет в этомorder

47398
94902
63523

Я думал, что это будет способ сделать это, используя свободный синтаксис LINQ

XDocument xResults = XDocument.Parse(responseXml);
List<string> sortedRecordIds = xResults.Descendants("Id")
                                .OrderBy(d => DateTime.Parse(d.Element("DatePaid").Value).Date)
                                .Select(d => d.Value)
                                .ToList();

Но это вызывает исключение. Я неправильно использую сортировку?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Я понял это.

XDocument xDoc = XDocument.Parse(responseXml);
List<string> sortedRecordIds = xDoc.Descendants("Payment")
                                .OrderBy(d => d.Element("DatePaid").Value)
                                .Select(d => d.Element("Id").Value)         
                                .ToList();

Моя проблема заключалась в том, что я должен был использовать Payment вместо Id. При запуске с узла Id не было элемента DatePaid для сортировки.

1 голос
/ 03 октября 2019

Если вы можете использовать XMLDocument, застрахованный от XDocument, вы можете добиться этого следующим образом.

Ваш XML (я думаю, у вас есть корневой элемент):

<root>
    <Payment>
        <Id>47398</Id>
        <DatePaid>09/01/2019 10:44:08</DatePaid>
    </Payment>
    <Payment>
        <Id>63523</Id>
        <DatePaid>09/07/2019 10:04:02</DatePaid>
    </Payment>
    <Payment>
        <Id>94902</Id>
        <DatePaid>09/05/2019 10:32:09</DatePaid>
    </Payment>
</root>

Код для получения в видевам нужно:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml( myXmlString );
List<string> list = xmlDocument.ChildNodes[ 0 ]
    .OfType<XmlNode>()
    .OrderBy( payment => DateTime.Parse( payment.ChildNodes[ 1 ].InnerText ) )
    .Select( payment => payment.ChildNodes[ 0 ].InnerText )
    .ToList();

Обновление Измените код, чтобы он заработал:

List<string> sortedRecordIds = xResults.Descendants("Payment")
    .OrderBy( d => DateTime.Parse( d.Element( "DatePaid" ).Value ).Date )
    .Select( d => d.Element("Id").Value )
    .ToList();
...