重新排列xml文件中的xml节点

时间:2017-04-21 12:09:42

标签: c# xml xml-parsing

我有像这样的xml文件

<?xml version="1.0" encoding="utf-8"?>
<TestSuite name="TestSuite1" UID="0" State="Indeterminate">
  <TestCase name="TestCase1" UID="1" State="Indeterminate" DataSourceId="1">
    <TestModule name="1" State="Unchecked" UID="1">
    </TestModule>
    <TestModule name="2" State="Unchecked" UID="2">
    </TestModule>
    <TestModule name="3" State="Unchecked" UID="3">
    </TestModule>
  </TestCase>
  <TestCase name="TestCase2" UID="33" State="Indeterminate" DataSourceId="1">
    <TestModule name="4" State="Unchecked" UID="4">
    </TestModule>
    <TestModule name="5" State="Unchecked" UID="5">
    </TestModule>
    <TestModule name="6" State="Unchecked" UID="6">
    </TestModule>
  </TestCase>
</TestSuite>

我必须将TestModule name="3"移到TestModule name="1"节点的上方或下方。

更新的文件将是这样的

<?xml version="1.0" encoding="utf-8"?>
<TestSuite name="TestSuite1" UID="0" State="Indeterminate">
  <TestCase name="TestCase1" UID="1" State="Indeterminate" DataSourceId="1">
    <TestModule name="3" State="Unchecked" UID="4bdb93ca-4f76-4709-ab88-13297def827b">
    </TestModule>
    <TestModule name="1" State="Unchecked" UID="5aa80bb6-9616-458c-b095-d6a0edbaf95b">
    </TestModule>
    <TestModule name="2" State="Unchecked" UID="2">
    </TestModule>
  </TestCase>
</TestSuite>

我在下面写了代码

XmlDocument xDoc = new XmlDocument();
xDoc.Load(Path.Combine(@"D:\Test Suite\TestSuite.xml"));

///////////////////
XmlNode l_NodeToAppend = null;
foreach (XmlNode i in e.SourceModels)
{
    l_NodeToAppend = xDoc.SelectSingleNode(String.Format("//*[@UID='{0}']", ((XmlNode)i).Attributes["UID"].Value));//1
    if (l_NodeToAppend != null)
        break;
}

XmlNode l_targteNode = xDoc.SelectSingleNode(String.Format("//*[@UID='{0}']", ((XmlNode)e.TargetModel).Attributes["UID"].Value));//3

bool flag = false;
l_NodeToAppend.InsertBefore(l_NodeToAppend, l_targteNode);

它给出错误“无法插入该节点的节点或任何祖先作为其自身的子节点。”

2 个答案:

答案 0 :(得分:1)

您必须将具体节点名称指定为TestModule

XmlNode l_NodeToAppend = null;
foreach (XmlNode i in e.SourceModels)
{
    l_NodeToAppend = xDoc.SelectSingleNode(string.Format("//TestModule[@UID='{0}']", i.Attributes["UID"].Value));
    if (l_NodeToAppend != null)
        break;
}

XmlNode l_targetNode = xDoc.SelectSingleNode(string.Format("//TestModule[@UID='{0}']", e.TargetModel.Attributes["UID"].Value));

l_targetNode.ParentNode.InsertBefore(l_NodeToAppend, l_targetNode);

正如另一个答案中已经提到的,您需要使用父节点

答案 1 :(得分:1)

这很有用。 Xpath表达式必须使用&#34; name&#34;属性,因为这些孩子没有数字UID。 InsertBefore也是从子节点的父节点执行的,第一个参数是要重新排列的子节点,第二个参数是用作重新排列的参考的子节点。

        XmlNode l_NodeToAppend = l_NodeToAppend = xDoc.SelectSingleNode(String.Format("//*[@name='{0}']", 1));//1

        XmlNode l_targteNode = xDoc.SelectSingleNode(String.Format("//*[@name='{0}']", 3));//3

        bool flag = false;
        l_NodeToAppend.ParentNode.InsertBefore(l_targteNode,l_NodeToAppend);
相关问题