C#使用Linq到XML排序XML文件

时间:2019-02-15 17:31:39

标签: c# xml linq

我有这个XML文件,我想按年然后按月排序。我曾尝试使用linq到xml,但它不会对文件进行排序。

  

还有什么我需要的吗?

XML文件

 <Monthly>
        <Totals Month="1" Year="2019"><Total>698560</Total><Distinct>103798</Distinct></Totals>
        <Totals Month="12" Year="2018"><Total>556091</Total><Distinct>90550</Distinct></Totals>
        <Totals Month="11" Year="2018"><Total>638932</Total><Distinct>100398</Distinct></Totals>
        <Totals Month="10" Year="2018"><Total>721583</Total><Distinct>106044</Distinct></Totals>
        <Totals Month="9" Year="2018"><Total>620371</Total><Distinct>97455</Distinct></Totals>
    </Monthly>

代码:

    XmlDocument xml = new XmlDocument();
    xml.LoadXml(XmlSource);

    XmlNodeList MonthlyTotals = xml.SelectNodes("//Report/Monthly");
var list = MonthlyTotals.XPathSelectElements("//Report/Monthly").OrderBy(r => r.Value);

///添加了新逻辑,但是代码从未完成

var SortedListMonthlyTotals = new XElement("Monthly", MonthlyTotals.Element("Monthly")
                .Elements()
                .OrderBy(e => (int)e.Attribute("Year"))
                   .ThenBy(e => (int)e.Attribute("Month"))
        );

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作。

var result = root.Elements("Totals")
                 .OrderBy(e => int.Parse(e.Attribute("Year").Value))
                 .ThenBy(e => int.Parse(e.Attribute("Month").Value));

完整代码

var str = @"<Monthly>
        <Totals Month='1' Year='2019'><Total>698560</Total><Distinct>103798</Distinct></Totals>
        <Totals Month='12' Year='2018'><Total>556091</Total><Distinct>90550</Distinct></Totals>
        <Totals Month='11' Year='2018'><Total>638932</Total><Distinct>100398</Distinct></Totals>
        <Totals Month='10' Year='2018'><Total>721583</Total><Distinct>106044</Distinct></Totals>
        <Totals Month='9' Year='2018'><Total>620371</Total><Distinct>97455</Distinct></Totals>
    </Monthly>";

    var root =  XElement.Parse(str);
    var result = root.Elements("Totals")
                     .OrderBy(e => int.Parse(e.Attribute("Year").Value))
                     .ThenBy(e => int.Parse(e.Attribute("Month").Value));

输出

enter image description here