2015-05-16 26 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