在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>
可以使用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);