2017-03-16 104 views
2

基于此link,我试图解决类似的问题。xmlstarlet根据条件选择值

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.foo</groupId> 
    <artifactId>iwidget</artifactId> 
    <packaging>jar</packaging> 
    <version>0.9.1b</version> 
    <name>iwidget</name> 
    <url>http://maven.apache.org</url> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
</project> 

我想提取groupId如果artifactId等于iwidget

我迄今为止尝试:

xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -v "/x:project/x:groupId" < pom.xml 

以上返回的groupId = foo.bar,不过,我希望它返回只有artifactId等于iwidget

$VAR='foo.bar' 
xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t -m "//x:project[artifactId="$VAR"]" -v "//x:project/groupId" < pom.xml 

我在想什么?

回答

1

建立在你的第一个命令,你应该能够应用在project一个简单的XPath谓词由artifactId元素值对其进行过滤:

xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t \ 
    -v "/x:project[x:artifactId='iwidget']/x:groupId" < pom.xml 

关于使用变量,需要用引号把它包起来以便XPath处理器将该值识别为字符串文字:

xmlstarlet sel -N x=http://maven.apache.org/POM/4.0.0 -t \ 
    -v "/x:project[x:artifactId='$VAR']/x:groupId" < pom.xml 
+0

这不适用于上面提供的pom。我可以使用shell变量$ var而不是'iwidget'吗?但是,即使没有变量,它也不起作用。 – askb

+0

我在你的文章中更新了XML,使其格式良好。你能用上面那个* exact * XML来试试上面的命令吗?我测试它在这里,它的工作(docker Ubuntu 16.04上的xmlstarlet).. – har07

+0

我在寻找的是使用shell变量($ VAR)“iwidget”。当我直接传递字符串时,这是有效的,而我通过$ VAR返回什么都没有。 – askb