我有像这样的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);
它给出错误“无法插入该节点的节点或任何祖先作为其自身的子节点。”
答案 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);