【问题标题】:Get unique node from xml file if nodes are repeated如果节点重复,则从 xml 文件中获取唯一节点
【发布时间】:2017-04-28 08:53:19
【问题描述】:
<TestCase name="TestCase2" UID="8eb5d202-1559-47b3-b39e-21e46d0bc9d2" State="Checked" DataSourceId="">
    <TestModule name="Recording1" State="Checked" UID="2">
    </TestModule>
    <TestModule name="Recording1" State="Checked" UID="2">
    </TestModule>
    <TestModule name="Recording1" State="Checked" UID="2">
    </TestModule>
  </TestCase>

在上面的 xml 中,我有多个具有相同名称和 UID 的节点,需要在第二个和第三个之间插入第一个节点但它失败了,因为 l_NodeToAppend 和 l_targetNode 相同,如果节点重复,我应该如何识别节点。

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

【问题讨论】:

  • 不清楚您要达到的目标。你能提供预期的结果xml吗?可以用 linq 吗?
  • 您想在示例 xml 中的何处插入节点?在第一次、第二次或第三次出现之前/之后?
  • 我需要在 Second 和 Third 之间插入 First 节点
  • 您可以使用位置 xpath 表达式 /TestCase/TestModule[1] 按文档顺序访问节点,它是 1 相对的。如果没有唯一的属性组合可供选择,您将无法唯一地访问节点!
  • @John 这些节点是完全一样的。如果你改变顺序,什么都不会改变。你为什么要这么做?

标签: c# xml xmldocument


【解决方案1】:

l_NodeToAppend 将是 UID 的第一个。 选择最后一个相同的 UID 对您有好处吗?

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

【讨论】:

  • 如果必须选择的节点在两者之间
  • 你可以用任意数字 N 替换 'last()' 但一定要包含第 N 个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多