XML文件中重新排列XML节点



我有像这样的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 SuiteTestSuite.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);

它给出了错误"不能将节点或该节点的任何祖先插入自身的孩子。"

您必须将具体节点名称指定为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);

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

这有效。XPath表达式必须使用"名称"属性,因为这些孩子没有数字UID。同样,插入之前是从孩子的父母处执行的,第一个论点是要重新安排的孩子,第二个论点是用作重排的参考。

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

最新更新