使用xmlstarlet通过id删除SVG中的节点

时间:2015-05-19 18:29:35

标签: shell svg xmlstarlet

我有一个包含许多SVG的文件夹。在所有SVG中,我需要删除具有特定ID的标记。有太多的文件可以手工完成,所以我一直在研究一个shell脚本为我做这个,但是无法弄清楚如何使用xmlstarlet去除标记。

例如,假设我们有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文件来摆脱不需要的标签?

干杯,多米尼克

1 个答案:

答案 0 :(得分:5)

SVG使用命名空间,我认为你必须定义它们:documentation

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