按节点innertext或attribute对XML排序

时间:2013-12-20 22:21:02

标签: c# 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>

我想要做的是按照Preisbindung对此XML进行排序。我用过这个

  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(); 。任何关于如何保持原始结构但具有已排序元素(或属性)的想法?

EDITED

我的预期输出是

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

1 个答案:

答案 0 :(得分: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();
}