在xmlNodeList c#中交换节点

本文关键字:交换 节点 xmlNodeList | 更新日期: 2023-09-27 18:14:57

假设有以下xml

<test>
    <step>
        <var name="name1" />
        <var name="name2" />
    </step>
    <step>
        <var name="name3" />
        <var name="name4" />
    </step>
    <step>
        <var name="name5" />
        <var name="name6" />
    </step>
</test>

我使用XmlNodeList,由"step"分隔。是否有一种方法可以直接交换或替换xmlnodelist中的步骤?

需要这样写:

<test>
    <step>
        <var name="name3" />
        <var name="name4" />
    </step>
    <step>
        <var name="name1" />
        <var name="name2" />
    </step>
    <step>
        <var name="name5" />
        <var name="name6" />
    </step>
</test>

在xmlNodeList c#中交换节点

可以使用XDocument类代替XMLDocument。这将把var节点的name3与name6交换。

using System.Linq;
using System.Xml.Linq;
class Test
{
    static void Main()
    {
        XDocument document = XDocument.Load("test.xml");
        Swap("name3", "name6", document);
        document.Save("test.xml");
    }
    static void Swap(string nameOne, string nameTwo, XDocument document)
    {
        var nameOneNode = document.Descendants("var").FirstOrDefault(p => p.Attribute("name").Value == nameOne);
        var nameTwoNode = document.Descendants("var").FirstOrDefault(p => p.Attribute("name").Value == nameTwo);
        nameOneNode.Attribute("name").Value = nameTwo;
        nameTwoNode.Attribute("name").Value = nameOne;
    }
}

读取XML文件时,不一定要保持XML文件中节点的顺序。例如,如果您的文件看起来像这样:

<xmlcontent>
    <node value="Hello" />
    <node value="World" />
</xmlcontent>

XML读取可以像这样返回节点:

<xmlcontent>
    <node value="World" />
    <node value="Hello" />
</xmlcontent>

要对XML节点应用类似"顺序"的东西,需要添加一个可以排序的属性,如

<xmlcontent>
    <node index="1" value="Hello" />
    <node index="2" value="World" />
</xmlcontent>

在这种情况下,"交换"两个元素将归结为交换索引值。

最后总算做到了,下面是代码:

        XmlDocument xml;
        XmlNodeList xmlList;
        xml = new XmlDocument();
        xml.Load(path);
        xmlList = xml.GetElementsByTagName("step");
        XmlNode refNode = xmlList[1];
        XmlNode newNode = xmlList[0];
        xml.DocumentElement.InsertAfter(newNode, refNode);