2015-05-19 27 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