XML to LINQ - 获取按另一个元素的值排序的节点值集合

XML to LINQ - Obtaining a node value collection ordered by the value of another element

我有以下 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>

因此结果列表将按此顺序

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();

但这会引发异常。我是不是排序方式不对?

如果你可以使用 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();

我想通了。

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 元素。