XPath中的通配符(*)使用问题:如何匹配名称包含aa与cc且中间内容可变的person节点下的phone元素
解决XPath同时匹配两种包含场景的问题
首先得说清楚:你之前用的aa*cc写法不生效,是因为XPath里的contains()函数并不支持用*作为通配符——这里的*会被当作普通字符来匹配,自然找不到对应的节点。
针对你的需求,要同时匹配name包含aa bb cc和aa cc的场景,本质是要找**name文本中同时包含"aa"和"cc"**的person节点,下面是两种可行的解决方案:
方案1:兼容XPath 1.0的通用写法
这是最稳妥的方式,几乎所有支持XPath的环境都能运行:
//person[contains(name, 'aa') and contains(name, 'cc')]//phone
逻辑解释:
contains(name, 'aa')确保name文本包含子串"aa"contains(name, 'cc')确保name文本同时包含子串"cc"- 用
and组合两个条件,就能覆盖你说的两种场景——不管"aa"和"cc"之间有没有其他字符(比如"bb"),只要同时存在这两个子串就会被匹配。
方案2:XPath 2.0+可用的正则匹配写法
如果你的运行环境支持XPath 2.0及以上(比如新版的Java、Python的lxml配合libxml2 2.9+等),可以用正则表达式更灵活地匹配:
//person[matches(name, 'aa.*cc')]//phone
逻辑解释:
matches()是XPath 2.0引入的正则匹配函数aa.*cc是正则表达式,其中.*表示匹配任意数量的任意字符(包括0个),正好对应"aa"和"cc"之间可以有内容(比如"bb")或者没有内容的情况。
验证你的XML示例
用上面任意一个表达式,都能从你提供的XML中获取到两个目标phone元素:
315255414523525
额外提示
如果name元素的文本可能存在前后空格或者多余换行,可以用normalize-space()处理后再匹配,避免空格干扰:
//person[contains(normalize-space(name), 'aa') and contains(normalize-space(name), 'cc')]//phone
内容的提问来源于stack exchange,提问作者user13831679
相关产品推荐
相关产品推荐

