使用 LINQ 对 XML 进行排序

本文关键字:排序 XML LINQ 使用 | 更新日期: 2023-09-27 18:37:05

我有以下XML:

<TRUCK Counter="0">
  <CARRIER>A PLUS EXPEDITING &amp; LOGISTICS INC.</CARRIER>
  <CARRIERPHONE>(000)000-0220</CARRIERPHONE>
  <UNITNO>100673V</UNITNO>
  <UNITTYPE>CARGO VAN                     </UNITTYPE>
  <DISTANCE>13</DISTANCE>
  <AVAILABLE>06/14/2012 09:00</AVAILABLE>
  <STATUS>In Service</STATUS>
  <LOCATION>REDFORD, MI</LOCATION>
  <NOTE> check 1st</NOTE>
  <PAYLOAD>3000</PAYLOAD>
  <DIMS>
    <BOXLENGTH>108</BOXLENGTH>
    <BOXWIDTH>53</BOXWIDTH>
    <BOXHEIGHT>48</BOXHEIGHT>
  </DIMS>
  <DOMICILE>US</DOMICILE>
  <SATELLITE>N</SATELLITE>
</TRUCK>

正在选择我想要的元素,并在传递要排序的列的方法中对它们进行排序:

public static XDocument GetSortedTrucksXml(string xmlBuffer, string sortColumn)
{
    XDocument xdoc = XDocument.Parse(xmlBuffer);
    int Counter = 0;
    var trucks = from s in xdoc.Element( "TRUCKS" ).Elements( "TRUCK" )
                 orderby ( string )s.Element( sortColumn )
                 select new XElement( "TRUCK",
                        s.Element( "CARRIER" ),
                        s.Element( "CARRIERPHONE" ),
                        s.Element( "UNITNO" ),
                        s.Element( "UNITTYPE" ),
                        s.Element( "DISTANCE" ),
                        s.Element( "AVAILABLE" ),
                        s.Element( "STATUS" ),
                        s.Element( "LOCATION" ),
                        s.Element( "NOTE" ),
                        s.Element( "PAYLOAD" ),
                        s.Element( "DIMS" ),
                        s.Element( "DOMICILE" ),
                        s.Element( "SATELLITE" ) );
    XDocument newDoc = new XDocument( new XElement( "TRUCKS" ) );

请注意,我只通过指定父元素来获取子元素。

我的问题是我如何按 BOXLENGTH、BOXWIDTH 或 BOXHEIGHT 进行排序? 如果我发送"DIMS/BOXLENGTH"作为排序列,则会出现错误。

使用 LINQ 对 XML 进行排序

可以使用 XPath Extension 方法:

// You need this namespace
using System.Xml.XPath;
// use this in your query
orderby (string)s.XPathSelectElement(sortColumn)