假设有以下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>
答案 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);