代码如下所示:
<xx>
<xy>
<xz>
<xx somestring="bbb" value= "0"...>
<xx somestring="cad" value= "0"...>
<xx somestring="axa" value= "0"...>
<xx somestring="aaa" value= "0"...>
<xz>
<xy>
<xx>
这需要按&#34; somestring&#34;进行排序。按字母顺序排列,节点的部门是可变的,xx,xy,xz的名称也是可变的,唯一始终存在的是&#34; somestring&#34;需要以这种方式排序,但父母的顺序需要保持不变。只是
有人能帮到我吗?如果在LINQ中完成,那将是非常棒的。
提前致谢
答案 0 :(得分:0)
以下是一个独立于元素名称排序的示例,只需根据Func<XElement, TKey>
选择的值进行排序:
class Program
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load("../../XMLFile1.xml");
doc.Root.Sort(el => (string)el.Attribute("bar"));
doc.Save(Console.Out);
}
}
public static class MyExt
{
public static void Sort<TKey>(this XElement input, Func<XElement, TKey> selector)
{
input.Elements().ToList().ForEach(el => el.Sort(selector));
input.ReplaceNodes(input.Elements().OrderBy(selector));
}
}
输入
<?xml version="1.0" encoding="utf-8" ?>
<root>
<section>
<foo bar="az">
<baz bar="c"/>
<baz bar="b"/>
<baz bar="a"/>
</foo>
<foo bar="am"/>
</section>
<section>
<div>
<value bar="x"/>
<value bar="d"/>
<value bar="a"/>
</div>
</section>
</root>
输出
<root>
<section>
<foo bar="am" />
<foo bar="az">
<baz bar="a" />
<baz bar="b" />
<baz bar="c" />
</foo>
</section>
<section>
<div>
<value bar="a" />
<value bar="d" />
<value bar="x" />
</div>
</section>
</root>
因此,对于您的示例,您将使用doc.Root.Sort(el => (string)el.Attribute("somestring"));
。