2013-12-20 54 views
0

我有以下的測試XML排序個XML或屬性

<?xml version="1.0" encoding="UTF-8"?> 

<!--This file is generated by the program.--> 
<Deals> 
    <Deal ID="1"> 
    <Preisformular> 
    <Preisbindung>a</Preisbindung> 
    <Factor>5</Factor> 
    <Date>1-1-2014</Date> 
    </Preisformular> 
    </Deal> 
    <Deal ID="2"> 
    <Preisformular> 
     <Preisbindung>b</Preisbindung> 
     <Factor>10</Factor> 
     <Date>30-12-2013</Date> 
    </Preisformular> 
    </Deal> 
</Deals> 

我想要做的就是解決這XML e.g通過Preisbindung。我用這個

XElement root = XElement.Load("test.xml") 
    var ordered = root.Elements("Deal").Elements("Preisformular") 
           .OrderByDescending(x => (string)x.Element("Preisbindung")) 
           .ToArray(); 

    root.RemoveAll(); 
    foreach (XElement tab in ordered) 
      root.Add(tab); 
    root.Save("test.xml"); 

但結果是我採取更新的XML文件是

<?xml version="1.0" encoding="UTF-8"?> 
-<Deals> 
    -<Preisformular> 
     <Preisbindung>b</Preisbindung> 
     <Factor>10</Factor> 
     <Date>30-12-2013</Date> 
    </Preisformular> 
    -<Preisformular> 
     <Preisbindung>a</Preisbindung> 
     <Factor>5</Factor> 
     <Date>1-1-2014</Date> 
    </Preisformular> 
    </Deals> 

我知道,這個問題是來自.RemoveAll(); 。任何想法如何保持原始結構,但與排序的元素(或屬性)?

編輯

我的預期輸出是

<?xml version="1.0" encoding="UTF-8"?> 
<Deals> 
    <Deal ID="2"> 
    <Preisformular> 
     <Preisbindung>b</Preisbindung> 
     <Factor>10</Factor> 
     <Date>30-12-2013</Date> 
    </Preisformular> 
    </Deal> 
    <Deal ID="1"> 
    <Preisformular> 
     <Preisbindung>a</Preisbindung> 
     <Factor>5</Factor> 
     <Date>1-1-2014</Date> 
    </Preisformular> 
    </Deal> 
    </Deals> 
+3

這很難張貼有效的XML?我不喜歡在問題中修復codes/xmls/jsons .....我的時間和你一樣有價值。 (順便說一句:你的預期輸出是什麼?) –

+0

XML是有效的,並由數據庫產生 – amigo

+0

沒有那些''不屬於你的XML。很可能你使用IE瀏覽器來查看你的xml。 –

回答

2

試試這個

XDocument doc = XDocument.Load("test.xml"); 
XElement dealsParent = doc.Element("Deals"); 
dealsParent.ReplaceNodes(dealsParent.Nodes().Cast<XElement>().OrderByDescending(element => element.Element("Preisformular").Element("Preisbindung").Value)); 

結果:

<Deals> 
    <Deal ID="2"> 
    <Preisformular> 
     <Preisbindung>b</Preisbindung> 
     <Factor>10</Factor> 
     <Date>30-12-2013</Date> 
    </Preisformular> 
    </Deal> 
    <Deal ID="1"> 
    <Preisformular> 
     <Preisbindung>a</Preisbindung> 
     <Factor>5</Factor> 
     <Date>1-1-2014</Date> 
    </Preisformular> 
    </Deal> 
</Deals> 

編輯(完整LINQPad C#程序,讓上面的結果):

void Main() 
{ 
    string xml = 
@"<Deals> 
<Deal ID=""1""> 
    <Preisformular> 
    <Preisbindung>a</Preisbindung> 
    <Factor>5</Factor> 
    <Date>1-1-2014</Date> 
    </Preisformular> 
    </Deal> 
<Deal ID=""2""> 
    <Preisformular> 
     <Preisbindung>b</Preisbindung> 
     <Factor>10</Factor> 
     <Date>30-12-2013</Date> 
    </Preisformular> 
    </Deal> 
</Deals>"; 

    XDocument doc = XDocument.Parse(xml); 
    XElement dealsParent = doc.Element("Deals"); 
    dealsParent.ReplaceNodes(dealsParent.Nodes().Cast<XElement>().OrderByDescending(element => element.Element("Preisformular").Element("Preisbindung").Value)); 

    dealsParent.Dump(); 
} 
+0

在我的情況下,您的提案給出了最初的XML – amigo

+0

在您澄清您的預期輸出後,我更新了使用'OrderByDescending'發佈的代碼。你有沒有得到更新的代碼? –

+0

是的,我做了,但... – amigo