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