如何删除不在 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 表达式选择的所有元素 yourExpr1
、yourExpr2
、...、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 节点?的主要内容,如果未能解决你的问题,请参考以下文章