的XPath与multipe节点属性

问题描述:

<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麻烦似乎让我的方式绕过它。的XPath与multipe节点属性

我尝试以下,但我得到无效表达错误:

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 

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

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

+0

哦,它像一个魅力工作。非常感谢! :) – Ali 2014-12-02 16:18:11

尝试包单引号内的所有属性值:

"/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"