【发布时间】:2019-11-13 16:19:27
【问题描述】:
我试图仅在同名标签之间按 id 对 xml 标签进行排序,我想在他们的孩子身上做同样的事情。现在我只能对根的第一级进行排序。任何想法如何以更有效的方式使其变得更有效?
感谢您的建议。
之前的示例:
<AFDatabase>
<Element1><id>1</id></Element1>
<Element1><id>10</id></Element1>
<Element1><id>5</id></Element1>
<Element1><id>4</id>
<ElementInside><id>3</id><ElementInside>
<ElementInside><id>2</id><ElementInside>
<ElementInside><id>1</id><ElementInside>
<ElementInside><id>0</id><ElementInside>
<ElementInside4><id>3</id><ElementInside4>
<ElementInside4><id>2</id><ElementInside4>
<ElementInside4><id>1</id><ElementInside4>
<ElementInside2><id>3</id><ElementInside2>
<ElementInside2><id>2</id><ElementInside2>
<ElementInside2><id>1</id><ElementInside2>
</Element1>
///之后///
<AFDatabase>
<Element1><id>1</id></Element1>
<Element1><id>4</id>
<ElementInside><id>0</id><ElementInside>
<ElementInside><id>1</id><ElementInside>
<ElementInside><id>2</id><ElementInside>
<ElementInside><id>3</id><ElementInside>
<ElementInside4><id>1</id><ElementInside4>
<ElementInside4><id>2</id><ElementInside4>
<ElementInside4><id>3</id><ElementInside4>
<ElementInside2><id>1</id><ElementInside2>
<ElementInside2><id>2</id><ElementInside2>
<ElementInside2><id>3</id><ElementInside2>
</Element1>
<Element1><id>5</id></Element1>
<Element1><id>10</id></Element1>
</AFDatabase>
代码
private static XElement xmlSorting(XElement root)
{
var xmlStruct = sortRootBYID(root);
return new XElement(root.Name,
root.Attributes(), new XElement("AFDatabase",
from child in root.Nodes()
where child.NodeType != XmlNodeType.Element
select child,
from child in xmlStruct.Elements()
select child));
}
private static XElement sortRootBYID(XElement root)
{
var ElementNames = getElementNames(root);
var xmlStruct = new XElement("x");
xmlStruct.RemoveAll();
foreach (var elementName in ElementNames)
{
var orderedTags = root.Elements("AFDatabase").Elements(elementName)
.OrderBy(xtab => (string)xtab.Element("id"))
.ToArray();
foreach (XElement tag in orderedTags)
xmlStruct.Add(tag);
}
return xmlStruct;
}
private static HashSet<string> getElementNames (XElement root)
{
HashSet<string> ElementNames = new HashSet<string>();
foreach (var element in root.Elements().Elements())
{
//Console.WriteLine();
if (element.Name != null)
{
ElementNames.Add(element.Name.ToString());
}
}
return ElementNames;
}
【问题讨论】:
-
听起来像是递归的工作。