xmlstarlet将一个元素添加到文件中

时间:2013-08-30 05:20:58

标签: xpath xmlstarlet

我有数百个要处理的xml文件 - 有些文件有特定的标记,有些则没有。如果我只是将标签添加到所有文件,那么一些文件会获得2个标签(没有惊喜!)。如何在没有笨拙的grep的xmlstarlet中选择要处理的文件?例如:

我在一些文件中有这个: ......

<parent_tag>
    <another_tag/> <-- but not in all files
</parent_tag>

我想要这个(但有些文件已经有了): ...

<parent_tag>
    <good_tag>foobar</good_tag>
    <another_tag/>
</parent_tag>

例如,这可行,但我希望我可以完全在没有grep:

的xmlstarlet中完成
grep -L good_tag */config.xml | while read i; do 
    xmlstarlet ed -P -S -s //parent_tag -t elem -n good_tag -v ""  $i > tmp || break
    \cp tmp $i
done

我把自己纠缠在一些XPATH异国情调中,如:

xmlstarlet sel --text --template --match //parent_tag --match "//parent_tag/node()[not(self::good_tag)]" -f --nl */config.xml

......但它没有做我所希望的......

1 个答案:

答案 0 :(得分:1)

只选择不包含<parent_tag/>的{​​{1}}元素进行插入:

<good_tag/>

如果您还想测试标签的正确内容:

xmlstarlet ed -P -S -s '//parent_tag[not(good_tag)]' -t elem -n good_tag -v ""