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

Posted

技术标签:

【中文标题】如何删除不在 xpath 字符串数组中的 xml 节点?【英文标题】:How to remove xml nodes that are not in an array of xpath strings? 【发布时间】:2012-01-13 16:02:32 【问题描述】:

我有一组 xpath 值一个 xml 提要

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

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

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

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

3) 如果没有,删除。

有没有更清洁的方法?

【问题讨论】:

【参考方案1】:

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

第一步。选择给定 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)
   ]

第二步。删除Step1中选中的所有节点。

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

 node.ParentNode.RemoveChild(node);

说明

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

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

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

【讨论】:

@Lagoona:对不起——你没有。但是您仍然可以查看我的其他答案,并由您来投票给您喜欢的答案。 :)【参考方案2】:

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

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

【讨论】:

听起来不错。 1)除了使用xmlnode数组之外,xmlnode中是否有本地方法来标记它? 2)在我的脑海中,我想不出一种联合xpath的方法......你能给一个提示/关键字来缩短我的研究时间吗?谢谢! @Lagoona - 1) 我不懂 c#,所以我无法提供任何特定于语言的支持。 2) 两个表达式的并集就是用|分隔的每个表达式,像这样:expr1 | expr2 | expr3(以此类推)。

以上是关于如何删除不在 xpath 字符串数组中的 xml 节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vbscript 删除 XML 文件中的特定节点

减少数组中的最后一个字符串元素而不在C#中删除它?

通过 Xpaths 从 R 中的文件中删除或过滤 XML 节点

在 Bash 中,如何查看字符串是不是不在数组中?

如何使用php在xpath中使用变量作为属性值?

获取没有特定祖先 xml xpath 的节点