1

次のような 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 とは別に、name 属性に基づいて FILE をソートします。ソートされたxmlでそれらをまとめて考慮してほしい。何をすべきですか?

4

2 に答える 2

2

実際、このコードはname属性によって子要素を並べ替えませ要素名でソートします:

orderby child.Name.ToString()

代わりに、"name" 属性の値を取得する必要があります (大文字と小文字が区別されます)。これは で可能ですが、属性に注意しながらこれchild.Attribute("name")を取得する必要があります。コードをインラインで書くのは少し厄介です。.Valuenull

child.Attributes個人的には、(コレクションを返す)このバージョンの方が便利だと思います:

orderby child.Attributes("name").Select(a => a.Value).FirstOrDefault()
于 2013-02-27T10:00:14.057 に答える
0
.OrderBy(e=>e.Attribute("name").Value)

ソートしたい場合、またはIEnumerableノードのノードでこのメソッドを使用してソートする場合は、任意のレベルでこれを再帰的に実行します

于 2013-02-27T09:44:55.563 に答える