使用嵌套元素按属性XML文件排序

时间:2014-01-31 16:46:00

标签: c# xml sorting

我想订购我的XML文件,但我在理解方面遇到了麻烦。我注意到很多建议与这种情况类似。

 var bookstore = xDoc.Element("bookstore")
            .Elements("book")
            .OrderByDescending(s => (int) s.Attribute("id")); 

我的XML是这样的:

<?xml version="1.0" encoding="utf-8"?>
<rank>
<difficulty template="gamer">
 <car type="FormulaA" />
 <car type="FormulaC" />
 <car type="GT2" />
 <car type="FormulaB" />
</difficulty>
<difficulty template="racer">
 <car type="FormulaA" />
 <car type="FormulaC" />
 <car type="GT2" />
 <car type="FormulaB" />
</difficulty>
<difficulty template="pro">
 <car type="FormulaA" />
 <car type="FormulaC" />
 <car type="GT2" />
 <car type="FormulaB" />
 </difficulty>
</rank>

我想修改它以使最终结果与此类似,然后再将其写入同一文件。

<?xml version="1.0" encoding="utf-8"?>
<rank>
<difficulty template="gamer">
 <car type="FormulaA" />
 <car type="FormulaB" />
 <car type="FormulaC" />
 <car type="GT2" />
</difficulty>
<difficulty template="racer">
 <car type="FormulaA" />
 <car type="FormulaB" />
 <car type="FormulaC" />
 <car type="GT2" />
</difficulty>
<difficulty template="pro">
 <car type="FormulaA" />
 <car type="FormulaB" />
 <car type="FormulaC" />
 <car type="GT2" />
 </difficulty>
</rank>

我尝试使用此代码对这些元素进行排序,但它没有给出我想要的结果。

XDocument xDoc = XDocument.Load(xmlFile);
var orderedXmlFile = xDoc.Descendants("car").OrderBy(s => (string)s.Attribute("type"));

XDocument doc = new XDocument(new XElement("rank"), orderedXmlFile);
doc.Save(xmlFile);

orderedXmlFile变为类似于

的列表
<car type="FormulaA" />
<car type="FormulaA" />
<car type="FormulaA" />
<car type="FormulaB" />
<car type="FormulaB" />
<car type="FormulaB" />
<car type="GT2" />
<car type="GT2" />
<car type="GT2" />

然后我无法保存文件。这是我第一次尝试用C#修改xml文件,所以我很乐意接受你想给我的任何建议或建议。

1 个答案:

答案 0 :(得分:2)

您并没有真正尝试订购所有 car元素 - 您正在尝试订购每个元素。对每个ReplaceNodes元素使用difficulty可能最简单:

foreach (var difficulty in xDoc.Root.Elements("difficulty"))
{
    difficulty.ReplaceNodes(difficulty.Elements()
                                      .OrderBy(x => (string) x.Attribute("type")));
}

然后再次保存xDoc

这假设您不介意修改现有的XDocument