2015-04-01 57 views
1

我試圖理清使用LINQ,但它不是在這裏工作的XML排序使用LINQ C#

<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> 

這裏XML多層次的XML是我曾嘗試

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。

+0

更改後保存'xdoc'嗎? – 2015-04-01 06:34:43

+0

不,我沒有保存它,只是看到結果爲字符串 – 2015-04-01 06:35:37

+2

是不是已經按本地名稱排序的「層次結構」的子元素?他們的順序是「日期」,然後是「文件夾」。 – dbc 2015-04-01 06:38:36

回答

3

重寫你的代碼是這樣的:

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

此代碼遞歸排序層次結構:文件總是夾後,去和所有的項目都按值排序屬性「名稱」。

+0

看起來很完美。 Upvoted! – 2015-04-01 09:05:15

+0

是的,它的工作,但一個問題,該方法返回的字符串沒有日期值。 – 2015-04-01 09:37:41

+1

@AdilWaqar,試試這個:var sortednodes = xDoc.Root.Elements()。OrderByDescending(e => e.Name.LocalName) 。ThenBy(e =>(string)e.Attribute(「name」)); ' – 2015-04-01 09:55:00