gpt4 book ai didi

c# - 对 XDocument 中的所有元素进行排序

转载 作者:可可西里 更新时间:2023-11-01 08:01:36 28 4
gpt4 key购买 nike

我有一个 XDocument,我想在其中按字母顺序对所有元素进行排序。这是结构的简化版本:

<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>

我想在所有级别对文档中的元素进行排序,到目前为止我可以这样排序:

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));
}

产生:

<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 实现这一目标吗?

感谢您的任何想法。

最佳答案

您已经有了一种对元素进行排序的方法。只需递归地应用它:

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));
}

请注意,这会从您的文档中删除所有非元素节点(属性、文本、评论等)。


如果你想保留非元素节点,你必须将它们复制过来:

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));
}

关于c# - 对 XDocument 中的所有元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3469801/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com