簡體   English   中英

使用Linq C#對MultiLevel XML進行排序

[英]Sorting MultiLevel XML using Linq C#

我正在嘗試使用Linq對XML進行排序,但它不起作用這里是XML

<hierarchy>
  <date>2015/04/01 15:29:10</date>
  <folder name="Root" id="Root">
    <file id="Fukui_R3_20150327182224.xlsx" />
    <file id="BordersTest_20150330144902.xlsx" />
    <folder name="level-1" id="1427455995512">
      <file id="Fukui_R3_20150327182224.xlsx" />
      <file id="BordersTest_20150330144902.xlsx" />
      <folder name="Zxcf" id="1427869724768">
        <file id="Fukui_R3_20150327182224.xlsx" />
        <file id="BordersTest_20150330144902.xlsx" />
      </folder>
      <folder name="Aegh" id="1427869732372">
        <file id="Fukui_R3_20150327182224.xlsx" />
        <file id="BordersTest_20150330144902.xlsx" />
      </folder>
      <folder name="Cfgt" id="1427869741718" />
    </folder>
    <folder name="A-level" id="1427869672074" />
    <folder name="G-Level" id="1427869682304" />
    <folder name="E-Level" id="1427869690384" />
    <folder name="1-A-Level" id="1427869701383" />
  </folder>
</hierarchy>

這是我嘗試過的代碼

 XDocument xDoc = XDocument.Load(FilePath);
 foreach (var trans in xDoc.Descendants("hierarchy"))
 {
     trans.ReplaceAll( trans.Elements().OrderBy(x=>x.Name.LocalName));
 }

 string newXml = xDoc.ToString();

但它返回了同樣未排序的XML。

像這樣重寫你的代碼:

XDocument xDoc = XDocument.Load(FilePath);
if (xDoc.Root != null)
    SortXml(xDoc.Root);
string newXml = xDoc.ToString();

並嘗試使用此方法:

private static void SortXml(XContainer parent)
{
    var elements = parent.Elements()
        .OrderByDescending(e => e.Name.LocalName)
        .ThenBy(e => (string)e.Attribute("name"))
        .ToArray();

    Array.ForEach(elements, e => e.Remove());

    foreach (var element in elements) {
        parent.Add(element);
        SortXml(element);
    }
}

此代碼以遞歸方式對層次結構進行排序:文件始終位於文件夾之后,所有項目按屬性“name”的值排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM