You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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元素:

  • 315255414
  • 523525

额外提示

如果name元素的文本可能存在前后空格或者多余换行,可以用normalize-space()处理后再匹配,避免空格干扰:

//person[contains(normalize-space(name), 'aa') and contains(normalize-space(name), 'cc')]//phone

内容的提问来源于stack exchange,提问作者user13831679

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:12:46