根据XElement的名称对XDocument进行排序

时间:2013-02-27 09:40:22

标签: c# xml sorting linq-to-xml xelement

我有一个像这样的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。该怎么办?

2 个答案:

答案 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节点上排序或只使用这种方法对它们进行排序,可以在任何级别递归执行此操作