【问题标题】:Rearrange xml node in xml file重新排列 xml 文件中的 xml 节点
【发布时间】:2017-04-21 12:09:42
【问题描述】:

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

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

【问题讨论】:

  • 每个TestCase节点中的最后一个TestModule节点必须是第一个节点吗?
  • 应该在运行时决定哪个节点是第一个或最后一个用户将决定

标签: c# xml xml-parsing


【解决方案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);

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

【讨论】:

  • 在运行时我必须重新排列多个测试模块中有多个 tescase 节点
【解决方案2】:

这行得通。 Xpath 表达式必须使用“name”属性,因为这些子项没有数字 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);

【讨论】:

  • 除了代码之外的一些解释会使这个答案对其他用户更有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
相关资源
最近更新 更多