xpath 选择按属性值列表排除的节点

Posted

技术标签:

【中文标题】xpath 选择按属性值列表排除的节点【英文标题】:xpath to select nodes excluding by attribute value list 【发布时间】:2012-07-15 01:02:12 【问题描述】:

我想知道是否有更短的方法来选择节点列表,忽略在列表中指定属性值的节点

工作示例:

/item[not(@uid='id1') and not(@uid='id2')]

所需的替代方案:

/item[not(@uid in('id1','id2'))]

【问题讨论】:

【参考方案1】:

您可以使用正则表达式 - 如果您的 xpath 实现支持它 - 或编写

/item[not(@uid='id1' or @uid='id2')]

可能会短一些。

【讨论】:

你是对的,如果我有两个像 'id1' 和 'id11' 这样的项目,另一种方法会错误地忽略这两个项目【参考方案2】:

如果属性名列表很长,以下是处理这种情况的好方法

//item[not(contains('|attr1|attr2|attr3|attr4|attr5|attr6|attrN|', 
                    concat('|', @uid, '|')
                    )
           )]

【讨论】:

我需要在 .NET 中构建很长的 XPath。无需使用带有种子的 LINQ Aggregate 方法之类的东西,您只需使用“|”连接字符串,添加尾随和前导,然后使用它。谢谢!【参考方案3】:

也许是这样的??

/item[not(contains('id1 id2', @uid))]

【讨论】:

有效,但更改存在风险,因为contains(x, y) 对不存在的 y 是正确的。 @Arne 这是最短的,但在什么情况下会失败?我们用来过滤的属性是没有空格的唯一id【参考方案4】:

至少在 Xpath 2 中,对序列的一般比较是成对和存在的,所以你可以这样写:

/item[not(@uid = ('id1','id2'))]

【讨论】:

以上是关于xpath 选择按属性值列表排除的节点的主要内容,如果未能解决你的问题,请参考以下文章

在 XML 文档中搜索值列表

java中使用xpath读取xml指定节点的属性的名称列表

使用 XPath,如何根据节点的文本内容和属性值来选择节点?

XPath 按属性值选择元素

Magento列表按属性排序按属性排序而不是值排序

排除正则表达式搜索中的单词列表