xmlstarlet以递归方式从多个文档中删除父元素

时间:2015-05-16 18:48:07

标签: xml recursion xpath xmlstarlet

在不同的目录中有一组xml文档,每个文档都是这样的:

    <xmldoc>
      <data>data text</data>
      <parent>
        <descendent1>
          <descendent2>motorcyclebaby.com?query</descendent2>
        </descendent1>
      </parent>
    </xmldoc>

我想删除包含&#34; motorcycle&#34;的父元素。在descendent2中的所有文件。到目前为止,我有这个,适用于单个文档:

   xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml

我试过用find:

递归删除父元素
    find . -name 'xmldoc.xml' -print0 | xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml

但未能加载外部实体&#34; xmldoc.xml&#34;&#39;

也尝试过:

    find . -name "xmldoc.xml" -exec xmlstarlet ed -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" xmldoc.xml {} +

1 个答案:

答案 0 :(得分:2)

想出来了!

    find . -iname "xmldoc.xml" -exec xmlstarlet ed --inplace -d "//parent[descendent1/descendent2[contains(text(),'motorcycle')]]" {} +

- 由于我的文档已大写,因此忽略了大小写

// parent [descendent1 / descendent2 [contains ...]需要选择子项包含搜索字符串的整个父元素。

- inplace需要更改实际文档,而不是在终端中打印。

使用-exec

{} +需要对find列出的每个文档进行更改。

\ O /