如何编写不区分大小写的XPath表达式提取XML属性?
实现不区分大小写的XPath属性提取
这问题我之前处理XML数据时也碰到过!毕竟XML天生大小写敏感,常规的@Fecha只能精准匹配首字母大写的属性,要兼容各种大小写变体(比如fecha、FECHA、fEcha),得根据你使用的XPath版本来选合适的写法:
方案1:XPath 2.0及以上版本(推荐)
如果你的解析器支持XPath 2.0或更高版本(比如Saxon、Java 8+的部分XML解析实现),可以直接用lower-case()函数统一转换属性名的大小写:
//*/@*[lower-case(local-name(.)) = 'fecha']
- 拆解一下逻辑:
local-name(.)获取当前属性的本地名称(不带命名空间前缀)lower-case()把名称转成全小写- 最后和全小写的目标值
'fecha'对比,就能匹配所有大小写变体的属性
如果你只需要提取特定节点下的属性(比如<Factura>节点),把//*换成目标节点路径即可:
//Factura/@*[lower-case(local-name(.)) = 'fecha']
方案2:XPath 1.0版本(兼容旧环境)
要是你只能用XPath 1.0(很多旧版解析器默认只支持1.0),可以用translate()函数模拟大小写转换,把所有大写字母映射成小写:
//*/@*[translate(local-name(.), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'fecha']
- 这里的
translate()会把属性名里的每个大写字母,替换成对应的小写字母,再和'fecha'对比,同样能实现不区分大小写的匹配。
注意事项
如果你的XML数据里同时存在多个大小写不同但名称近似的属性(比如同时有@Fecha和@fecha),这种写法会把它们都匹配出来,提前确认数据结构避免提取到多余值哦。
内容的提问来源于stack exchange,提问作者Omega Kewt
相关产品推荐
相关产品推荐

