xmlstarlet递归地从多个文档中删除父元素

xmlstarlet delete parent elements from multiple documents recursively

在不同的目录中有一组 xml 文档,每个文档如下:

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

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

   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

但得到了'failed to load external entity "xmldoc.xml"'

也尝试过:

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

想通了!

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

-iname 忽略大小写,因为我的文档是大写的

//parent[descendent1/descendent2[包含...需要 select 子元素包含搜索字符串的整个父元素。

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

{} + 需要与 -exec 一起对 find 列出的每个文档进行更改。

\o/