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