2015-05-19 67 views
3

我有一個包含許多SVG的文件夾。從所有SVG中,我需要刪除具有特定ID的標籤。有太多的文件需要手工完成,所以我一直在研究一個shell腳本來爲我做,但無法弄清楚如何使用xmlstarlet去除標籤。使用xmlstarlet通過id刪除SVG中的節點

例如,假設我們有foo.svg:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"> 
    <g id="delete"/> 
    <g id="keep"/> 
</svg> 

然後發出命令:xmlstarlet ed -d "g[@id='delete']" foo.svg > bar.svg

會導致它在:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" xmlns="http://www.w3.org/2000/svg"> 
    <g id="keep"/> 
</svg> 

,但事實並非如此。 bar.foo仍然包含<g id="delete"/>

有誰知道刪除<g id="delete"/>標記的正確命令?或者我可以使用任何其他工具來批處理SVG文件以擺脫不需要的標記?

乾杯,多米尼克

+0

感謝您指出了這一點,我現在修正了錯字。 – user473453

回答

4

SVG使用的命名空間,我認爲你必須定義它們:documentation

那麼正確的語法似乎是:
xmlstarlet ed -N ns=http://www.w3.org/2000/svg -d "//ns:g[contains(@id,'delete')]" foo.svg > bar.svg