我有以下测试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>
答案 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();
}