用xmlstarlet concat多个xml元素

时间:2014-01-01 12:01:28

标签: xml bash xmlstarlet

我正在尝试编写一个bash脚本来从xml文件such as this中提取多个“控制器”,并用管道将它们分开,即Tom Tykwer | Andy Wachowski。

相关的xml部分是:

<directors>
<item>Tom Tykwer</item>
<item>Andy Wachowski</item>
</directors>

使用bash脚本中的xmlstarlet,可以使用以下命令:

DIRECTORS=$(xmlstarlet sel -t -v "imdbdocument/directors/item" mymoviexml)
echo $DIRECTORS

给我

Tom Tykwer Andy Wachowski

这个命令直接在终端

xmlstarlet sel -t -v "imdbdocument/directors/item" mymovieapi.xml

给了我:

(empty line)
Tom Tykwer
Andy Wachowski

当我没有指定-n选项时,我不知道为什么要添加新行。

我的一些搜索建议如下:

xmlstarlet sel -t -m "imdbdocument/directors" -v "item" -o "|" mymovieapi.xml 

但这只是给了我:

Tom Tykwer
Andy Wachowski|

我很感激我能得到任何帮助。我在Xianuntu 13.10上的Debian Wheezy和xmlstarlet 1.5.0上看到xmlstarlet 1.3.1的这种行为。

2 个答案:

答案 0 :(得分:2)

仅使用xmlstarlet的解决方案:

xmlstarlet sel -T -t -v '/imdbdocument/directors/item[1]' -m '/imdbdocument/directors/item[position()>1]' -o '|' -v . mymovieapi.xml

我使用1.5版进行了测试,但我相信它也适用于早期版本。


替代方案,使用--if而不是2个XPath表达式:

xmlstarlet sel -T -t -m '/imdbdocument/directors/item' --if 'position() > 1' -o '|' -b -v . mymovieapi.xml

-b--break,它结束当前语句(条件或循环),如C中的}

答案 1 :(得分:1)

你可以尝试

xmlstarlet sel -t -v "imdbdocument/directors/item" mymovieapi.xml |  awk '1' ORS='|'

带输出

|Tom Tykwer|Andy Wachowski|

或者如果您不想要前导和尾随管道|

xmlstarlet sel -t -v "imdbdocument/directors/item" mymovieapi.xml | awk 'NF>0 {if (i++) printf "|"; printf "%s", $0 } END { printf "\n" }'

给出

Tom Tykwer|Andy Wachowski