如何使用XPath选择XML中仅含属性无类的div元素?
搞定这个XPath选择问题!
嘿,我明白你现在的困扰了——要选中这个没有class、只有特殊attrs属性的div确实容易在引号上卡壳。我来给你一步步拆解正确的表达式:
首先看你给出的示例div结构:<div attrs="{'invisible': [('state', '!=', 'recruit')]}">...</div>,核心是要精确匹配attrs属性的完整值,这里的关键是处理XPath里的引号冲突问题:
1. 精确匹配的XPath表达式
如果你的XML里attrs属性是用双引号包裹值的(就像你示例里那样),直接用下面的表达式就行:
//div[@attrs="{'invisible': [('state', '!=', 'recruit')]}"]
要是XML里attrs属性是用单引号包裹值的(比如<div attrs='{'invisible': [('state', '!=', 'recruit')]}'>),这时候要把属性值里的单引号转成两个连续单引号(XPath里的单引号转义规则),表达式变成:
//div[@attrs='{''invisible'': [(''state'', ''!='', ''recruit'')]}']
2. 模糊匹配(如果不需要完全精确)
要是你只需要选中attrs里包含invisible、state、!=和recruit这些关键词的div,可以用contains()函数来放宽匹配条件,避免引号转义的麻烦:
//div[contains(@attrs, 'invisible') and contains(@attrs, 'state') and contains(@attrs, '!=') and contains(@attrs, 'recruit')]
不过要注意,这种方式可能会误匹配其他结构相似的div,所以能精确匹配的话优先用第一种。
额外小提示
如果你的attrs属性值实际是标准JSON格式(比如用双引号代替单引号:{"invisible": [["state", "!=", "recruit"]]}),那表达式要对应调整引号,比如:
//div[@attrs='{"invisible": [["state", "!=", "recruit"]]}']
这样应该就能精准选中你要替换的div啦!
内容的提问来源于stack exchange,提问作者YHussein
相关产品推荐
相关产品推荐

