交换xmlNodeList C#中的节点

时间:2013-05-23 14:36:04

标签: c# xml

假设有以下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>

3 个答案:

答案 0 :(得分:3)

您可以使用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;
    }
}

答案 1 :(得分:1)

读取XML文件时,不一定要保留XML文件中节点的顺序。例如,如果您的文件如下所示:

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

XML读取可能会返回如下节点:

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

要应用类似&#34; order&#34;对于XML节点,您需要添加可以排序的属性,例如

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

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

答案 2 :(得分:0)

最后设法做到了,这是代码:

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