我需要按元素名称订购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>
Run Code Online (Sandbox Code Playgroud)
但我需要输出
<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>
Run Code Online (Sandbox Code Playgroud)
任何人都可以知道如何按名称对元素进行排序.
试试这个(假设你在元素名称中有相同的模式):
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");
}
}
Run Code Online (Sandbox Code Playgroud)
您也可以只使用一个OrderBy(不使用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();
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的,这是通过使用IComparer实现来实现它的方法(信用应该转到这个答案):
var ordered = xDoc.Root.Elements()
.OrderBy(i => i.Name.LocalName, new NaturalSortComparer())
.ToList();
Run Code Online (Sandbox Code Playgroud)
本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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |