我有一个像这样的XML文件:
<file name="picture1.jpg"/>
<file name="file1.txt"/>
<folder name="subfolder">
<file name="picture2.jpg"/>
<file name="file2.txt"/>
<folder name="anotherfolder">
<file name="file3.txt"/>
</folder>
</folder>
<folder name="anotherfolder">
</folder>
需要像这样排序:
<folder name="anotherfolder">
</folder>
<file name="file1.txt"/>
<file name="picture1.jpg"/>
<folder name="subfolder">
<folder name="anotherfolder">
<file name="file3.txt"/>
</folder>
<file name="file2.txt"/>
<file name="picture2.jpg"/>
</folder>
我需要排序的代码是:
public static XDocument Sort(XDocument file)
{
return new XDocument(Sort(file.Root));
}
private static XElement Sort(XElement element)
{
XElement newElement = new XElement(element.Name,
from child in element.Elements()
orderby child.Name.ToString()
select Sort(child));
if (element.HasAttributes)
{
foreach (XAttribute attrib in element.Attributes())
{
newElement.SetAttributeValue(attrib.Name, attrib.Value);
}
}
return newElement;
}
它完成了工作......但只是部分工作。它根据名称属性与FOLDER分别对FILE进行排序。我希望它们可以一起考虑排序的xml。该怎么办?
答案 0 :(得分:2)
实际上,这段代码不按名称属性订购子元素;它按元素名称排序:
orderby child.Name.ToString()
您需要做的是获取“name”属性的值(区分大小写!)。这可以通过child.Attribute("name")
实现,但您需要在注意.Value
属性时获取此null
;编写内联会稍微尴尬。
我个人认为这个版本child.Attributes
(返回一个集合)更方便:
orderby child.Attributes("name").Select(a => a.Value).FirstOrDefault()
答案 1 :(得分:0)
.OrderBy(e=>e.Attribute("name").Value)
如果你想在IEnumerable
节点上排序或只使用这种方法对它们进行排序,可以在任何级别递归执行此操作