排序的所有元素中的XDocument [英] Sorting all the elements in a XDocument
问题描述
我有一个的XDocument,我想排序的所有元素的字母顺序。下面是结构的简化版本:
I have a XDocument where I'd like to sort all of the elements alphabetically. Here's a simplified version of the structure:
<Config>
<Server>
<Id>svr1</Id>
<Routing>
<RoutingNodeName>route1</RoutingNodeName>
<Subscription>
<Id>1</Id>
</Subscription>
<RoutingParameters id="Routing1">
<Timeout>7200</Timeout>
</RoutingParameters>
</Routing>
<Storage>
<Physical>HD1</Physical>
</Storage>
</Server>
<Applications>
<Services>
<Local></Local>
</Services>
</Applications>
</Config>
我想各级该文件的元素进行排序,到目前为止,我可以像这样排序的:
I'm wanting to sort the elements in this documents at all levels, so far I'm able to sort it like so:
private static XDocument Sort(XDocument file)
{
return new XDocument(
new XElement(file.Root.Name,
from el in file.Root.Elements()
orderby el.Name.ToString()
select el));
}
主要生产:
Which produces:
<Config>
<Applications>
<Services>
<Local></Local>
</Services>
</Applications>
<Server>
<Id>svr1</Id>
<Routing>
<RoutingNodeName>route1</RoutingNodeName>
<Subscription>
<Id>1</Id>
</Subscription>
<RoutingParameters id="Routing1">
<Timeout>7200</Timeout>
</RoutingParameters>
</Routing>
<Storage>
<Physical>HD1</Physical>
</Storage>
</Server>
</Config>
我想能够排序所有以同样的方式的子元素(通过递归函数理想情况下)。任何想法如何,我能得到这个与LINQ回事?
I'd like to be able to sort all of the children elements in the same way (through a recursive function ideally). Any ideas how I can get this going with LINQ?
感谢您的任何想法。
推荐答案
您已经有了一个对元素进行排序的方法。只是递归地应用它:
You already have a method to sort the elements. Just apply it recursively:
private static XElement Sort(XElement element)
{
return new XElement(element.Name,
from child in element.Elements()
orderby child.Name.ToString()
select Sort(child));
}
private static XDocument Sort(XDocument file)
{
return new XDocument(Sort(file.Root));
}
请注意,这条所有非元素节点(属性,文本,注释,等),从您的文档。
Note that this strips all non-element nodes (attributes, text, comments, etc.) from your document.
如果您想保留非元素节点,您必须将它们拷贝过来
If you want to keep the non-element nodes, you have to copy them over:
private static XElement Sort(XElement element)
{
return new XElement(element.Name,
element.Attributes(),
from child in element.Nodes()
where child.NodeType != XmlNodeType.Element
select child,
from child in element.Elements()
orderby child.Name.ToString()
select Sort(child));
}
private static XDocument Sort(XDocument file)
{
return new XDocument(
file.Declaration,
from child in file.Nodes()
where child.NodeType != XmlNodeType.Element
select child,
Sort(file.Root));
}
这篇关于排序的所有元素中的XDocument的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!