1

xmlelement を要素名で並べ替える必要があります。以下に、ファイルを配置する前と配置した後について説明しました。

次のようなファイル データ:

  <Root>
       <RB-3-10  K="3" P="0.5" L="5" G="5.5" E="3" l="5" O="2.5" />
       <RB-4-6   K="3" P="0.5" L="6" G="5.5" E="3" l="6" O="2.5" />
       <RB-3-5   K="3" P="0.5" L="10" G="5.5" E="3" l="10" O="2.5" />
       <RB-3-12  K="3" P="0.5" L="12" G="5.5" E="3" l="12" O="2.5" />
       <RB-4-14  K="3" P="0.5" L="14" G="5.5" E="3" l="14" O="2.5" />
       <RB-3-15  K="3" P="0.5" L="15" G="5.5" E="3" l="15" O="2.5" />
       <RB-5-16  K="3" P="0.5" L="16" G="5.5" E="3" l="16" O="2.5" />
  </Root>

しかし、次のような出力が必要です

  <Root>
       <RB-3-5    K="3" P="0.5" L="10" G="5.5" E="3" l="10" O="2.5" />
       <RB-3-10   K="3" P="0.5" L="5" G="5.5" E="3" l="5" O="2.5" />
       <RB-3-12   K="3" P="0.5" L="12" G="5.5" E="3" l="12" O="2.5" />
       <RB-3-15   K="3" P="0.5" L="15" G="5.5" E="3" l="15" O="2.5" />
       <RB-4-6    K="3" P="0.5" L="6" G="5.5" E="3" l="6" O="2.5" />
       <RB-4-14   K="3" P="0.5" L="14" G="5.5" E="3" l="14" O="2.5" />
       <RB-5-16   K="3" P="0.5" L="16" G="5.5" E="3" l="16" O="2.5" /> 
  </Root>

要素を名前でソートする方法は誰でも知っています。

4

1 に答える 1

7

これを試してください(要素名に同じパターンがあると仮定して):

using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        var xDoc = XDocument.Load("xml.xml");
        var ordered = xDoc.Root.Elements()
            .OrderBy(i => Convert.ToInt32(i.Name.LocalName.Split('-')[1]))
            .ThenBy(i => Convert.ToInt32(i.Name.LocalName.Split('-')[2]))
            .ToList();
        xDoc.Root.ReplaceAll(ordered);
        xDoc.Save("xml_1.xml");
    }
}

OrderByto を( を使用せずに) 1 つだけ使用することもThenByできますが、XML タグ名で整数がどのくらい大きくなるかを事前に知っておく必要があります。以下は、2 桁以下であると仮定した例です。

var ordered = xDoc.Root.Elements()
    .OrderBy(i => Convert.ToInt32(
        i.Name.LocalName.Split('-')[1].PadLeft(2, '0') +
        i.Name.LocalName.Split('-')[2].PadLeft(2, '0')))
    .ToList();

最後になりましたが、実装を使用してそれを行う方法をIComparer次に示します(クレジットはこの回答に移動する必要があります):

var ordered = xDoc.Root.Elements()
    .OrderBy(i => i.Name.LocalName, new NaturalSortComparer())
    .ToList();

NaturalSortComparerクラス:

public class NaturalSortComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }

    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    public static extern int StrCmpLogicalW(string x, string y);
}
于 2013-07-09T07:27:11.407 に答える