具有多个属性的节点的Xpath

时间:2014-12-01 19:47:56

标签: xml xpath xmlstarlet

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>Foo</groupId>
    <artifactId>Bar</artifactId>
    <version>9.9.9</version>
</project>

我正在尝试使用xmlstarlet编辑版本值,但是由于父节点具有多个我无法看到的属性,因此无法提出指向该节点的XPath绕过它。

我尝试了以下操作,但是我得到了无效的表达式错误:

xmlstarlet ed --omit-decl -L -u "/project[@xmlns=http://maven.apache.org/POM/4.0.0 and @xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance and @xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd]/version" -v 10.10.10 ./file.xml

2 个答案:

答案 0 :(得分:1)

xmlns属性是namespace个定义。没有冒号的那个定义了默认命名空间。 XPath不支持默认命名空间,因此您必须明确引用它。最新版本的XMLStarlet(1.5.0+)将默认命名空间绑定到&#34; _&#34;所以你可以这样做:

xmlstarlet ed --omit-decl -L -u "/_:project/_:version" -v 10.10.10 ./file.xml

您可以像这样明确地绑定名称空间:

xmlstarlet ed -N pom=http://maven.apache.org/POM/4.0.0 --omit-decl -L -u "/pom:project/pom:version" -v 10.10.10 ./file.xml

另见Section 5.1 of the manual

答案 1 :(得分:0)

尝试将所有属性值包装在单引号中:

"/project[@xmlns='http://maven.apache.org/POM/4.0.0' and @xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' and @xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd']/version"