如何用XPath 1.0获取pom.xml中名称含点的标签值?
用XPath 1.0获取pom.xml中含点的元素值
要从带命名空间的pom.xml里提取名称包含点的元素值,需要注意两个核心问题:pom.xml默认带maven命名空间(http://maven.apache.org/POM/4.0.0),且XPath里的点是特殊字符(表示当前节点轴),直接写sonar.exclusions这类名称会触发语法错误,以下是两种可行方案:
方案1:用local-name()匹配元素名(无需绑定命名空间前缀)
通过local-name()直接匹配元素的本地名称(忽略命名空间),写法简单直观:
- 获取
<sonar.exclusions>的值://*[local-name()='properties']/*[local-name()='sonar.exclusions']/text() - 获取
<jacoco.line.min.coverage>的值://*[local-name()='properties']/*[local-name()='jacoco.line.min.coverage']/text() - 获取
<jacoco.complexity.min.coverage>的值://*[local-name()='properties']/*[local-name()='jacoco.complexity.min.coverage']/text()
方案2:绑定命名空间前缀(更规范的写法)
如果需要严格遵循命名空间规则,可先将maven的命名空间绑定一个前缀(比如m),再用带引号的元素名(避免点被解析为特殊符号)查询:
以绑定前缀m为例,对应的XPath语句:
- 获取
<sonar.exclusions>的值://m:properties/m:'sonar.exclusions'/text() - 获取
<jacoco.line.min.coverage>的值://m:properties/m:'jacoco.line.min.coverage'/text() - 获取
<jacoco.complexity.min.coverage>的值://m:properties/m:'jacoco.complexity.min.coverage'/text()
注:不同工具绑定命名空间的方式不同,比如在
xmllint中可执行:xmllint --xpath "//m:properties/m:'sonar.exclusions'/text()" --namespace "m=http://maven.apache.org/POM/4.0.0" pom.xml
内容的提问来源于stack exchange,提问作者Observer
相关产品推荐
相关产品推荐

