如何删除不在xpath字符串数组中的xml节点?

时间:2012-01-13 16:02:32

标签: c# xml xpath xmldocument xmlnode

我有一系列xpath值一个xml feed

当Feed收到时,我想通过删除不在我的xpath 数组中的节点来过滤每个xml文件

我可以想到一种非常肮脏的方法:

1)对于xml中的每个节点,我形成了它的xpath

2)检查它是否在数组中。

3)如果没有,请删除。

有更清洁的方式吗?

2 个答案:

答案 0 :(得分:1)

您的方法是倒退的(并且容易出错,因为任何给定节点都可以通过多个有效的XPath表达式进行选择)。你应该:

  • 首先,迭代表达式数组,然后以某种方式标记每个表达式选择的节点(例如,在每个节点上设置一些标志)。更好的是:评估所有表达式的并集,并在一步中选择所有内容。
  • 然后,遍历DOM并删除第一步中未标记的任何元素。

答案 1 :(得分:1)

  

当Feed进入时,我想通过删除来过滤每个xml文件   不在我的xpath

数组中的节点

<强>步骤1。选择未由给定XPath表达式选择的所有节点

我想通过“节点”你的意思是元素。 如果是这样,这个XPath表达式

//*[count(. | yourExpr1 | yourExpr2 ... | yourExprN)
   >
    count(yourExpr1 | yourExpr2 ... | yourExprN)
   ]

选择XML文档中未被任何N XPath表达式选择的所有元素 yourExpr1yourExpr2,...,yourExprN

如果“节点”是指元素,文本节点,处理指令节点(PI),注释节点和属性节点,请使用此XPath表达式选择N XPath表达式未选择的所有节点:

(//node() | //*/@*)
   [count(. | yourExpr1 | yourExpr2 ... | yourExprN)
   >
    count(yourExpr1 | yourExpr2 ... | yourExprN)
   ]

<强>第二步。删除在步骤1中选择的所有节点。

对于上面步骤1中选择的每个节点,请使用:

 node.ParentNode.RemoveChild(node);

<强>解释

  1. XPath联合运算符|生成两个节点集的并集。因此,当应用于XML文档时,表达式yourExpr1 | yourExpr2 ... | yourExprN将生成由N个给定XPath表达式中的任何一个选择的所有节点的集合。

  2. 节点$n完全不属于一组节点$ns ...

    count($n | $ns) > count($ns)