【发布时间】:2012-01-13 16:02:32
【问题描述】:
我有一组 xpath 值和一个 xml 提要。
当提要进入时,我想通过删除不在我的 xpath 数组中的节点来过滤 每个 xml 文件。。
我可以想到一个非常肮脏的方法来做到这一点:
1) 对于 xml 中的每个节点,我形成了它的 xpath
2) 检查它是否在数组中。
3) 如果没有,删除。
有没有更清洁的方法?
【问题讨论】:
标签: c# xml xpath xmldocument xmlnode
我有一组 xpath 值和一个 xml 提要。
当提要进入时,我想通过删除不在我的 xpath 数组中的节点来过滤 每个 xml 文件。。
我可以想到一个非常肮脏的方法来做到这一点:
1) 对于 xml 中的每个节点,我形成了它的 xpath
2) 检查它是否在数组中。
3) 如果没有,删除。
有没有更清洁的方法?
【问题讨论】:
标签: c# xml xpath xmldocument xmlnode
当提要进入时,我想通过删除 每个 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)
【讨论】:
您的方法是向后的(并且容易出错,因为任何给定的节点都可以通过多个有效的 XPath 表达式来选择)。你应该:
【讨论】:
|分隔的每个表达式,像这样:expr1 | expr2 | expr3(以此类推)。