2015-05-16 19 views
3

有一组单独的目录中的XML文档的,这样每个文档:xmlstarlet删除多个文档的父元素递归

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

我想删除包含“摩托车”的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 

,但得到“无法加载外部实体“xmldoc.xml””

也试过:

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

在单个文档中工作的行可能无法工作。必须添加--inplace:xmlstarlet ed --inplace -d“// parent [descendent1/descendent2 [contains(text(),'motorcycle')]]”xmldoc.xml – motorbaby

回答

2

想通了!因为我的文档进行资本

//父

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

-iname忽略大小写[descendent1/descendent2 [含有......需要选择那里的孩子包含的查找的字符串整个父元素。

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

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

\ o/

+0

您不应该需要'xmldoc.xml '最后,'{}'去代替它。否则,您需要重新编辑当前目录中的文档(对于此特定编辑无害,但通常不会)。 – npostavs

+0

正确@npostavs。这确实奏效。谢谢! – motorbaby

+0

@shellter这是一个非问题,因为一旦元素被删除,该命令就无法执行任何操作。但根据你的建议删除。 (对新读者来说:它表示'find。-iname“xmldoc.xml”-exec xmlstarlet ed --inplace -d“// parent [descendent1/descendent2 [contains(text(),'motorcycle')]]”xmldoc。 xml {} +') – motorbaby