1

我有一个 xpath 值数组一个 xml 提要

当提要进入时,我想通过删除不在我的 xpath 数组中的节点来过滤每个 xml 文件

我可以想到一个非常肮脏的方法来做到这一点:

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

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

3)如果没有,删除。

有没有更清洁的方法?

4

2 回答 2

1

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

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

我猜“节点”是指元素。如果是这样,这个 XPath 表达式

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

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

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

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

第2步。删除在 Step1 中选择的所有节点。

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

 node.ParentNode.RemoveChild(node);

说明

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

  2. 一个节点$n不属于一组节点的$ns确切时间...

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

于 2012-01-14T20:48:04.943 回答
1

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

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