Xml.Linq:反转 XML 的子节点

Posted

技术标签:

【中文标题】Xml.Linq:反转 XML 的子节点【英文标题】:Xml.Linq: Reversing child-nodes of a XML 【发布时间】:2020-05-20 14:51:24 【问题描述】:

我根据用户输入在运行时创建了以下 XML 文件。

<Parent>
    <X1>1</X1>
    <X2>
        <Y1>
            <Rank>4</Rank>
        </Y1>
        <Y1>
            <Rank>3</Rank>
        </Y1>
        <Y1>
            <Rank>2</Rank>
        </Y1>
        <Y1>
            <Rank>1</Rank>
        </Y1>
    </X2>
</Parent>

现在,我想以这样的方式反转子节点&lt;Rank&gt; 按升序排列。 我想要以下输出

<Parent>
    <X1>1</X1>
    <X2>
        <Y1>
            <Rank>1</Rank>
        </Y1>
        <Y1>
            <Rank>2</Rank>
        </Y1>
        <Y1>
            <Rank>3</Rank>
        </Y1>
        <Y1>
            <Rank>4</Rank>
        </Y1>       
    </X2>
</Parent>

产生这个问题是因为我使用的是 AddFirst 方法。我没有找到任何与 AddFirst 完全相反的方法。

【问题讨论】:

【参考方案1】:

您可以使用Reverse

例子:

static void Main(string[] args)

    XElement srcTree = new XElement("Parent",
                new XElement("X1", 1),
                new XElement("X2",
                    new XElement("Y1", new XElement("Rank", 4)),
                    new XElement("Y1", new XElement("Rank", 3)),
                    new XElement("Y1", new XElement("Rank", 2)),
                    new XElement("Y1", new XElement("Rank", 1)))
            );

    var reverseList = srcTree.Elements("X2").Descendants("Y1").InDocumentOrder().Reverse().ToList();

    srcTree.Element("X2").Remove();
    srcTree.Add(new XElement("X2", reverseList));


    Console.WriteLine(srcTree);
    Console.ReadLine();

它会给你想要的结果:

<Parent>
  <X1>1</X1>
  <X2>
    <Y1>
      <Rank>1</Rank>
    </Y1>
    <Y1>
      <Rank>2</Rank>
    </Y1>
    <Y1>
      <Rank>3</Rank>
    </Y1>
    <Y1>
      <Rank>4</Rank>
    </Y1>
  </X2>
</Parent>

【讨论】:

以上是关于Xml.Linq:反转 XML 的子节点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XQuery 获取 XML 文件中的子节点数

如何反序列化xml文件的子节点

xml linq

C# XML 给一个元素添加带有内容的子元素 给一个元素添加带有内容的子元素

C# XML 给xml文件添加根节点

ztree获取当前选中节点子节点id集合的方法(转载)