使用 xmlstarlet 按 id 删除 SVG 中的节点
Remove a node in an SVG by id using 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 文件以去除不需要的标签的任何其他工具?
干杯,多米尼克
SVG 使用名称空间,我认为您必须定义它们:documentation
那么正确的语法应该是:
xmlstarlet ed -N ns=http://www.w3.org/2000/svg -d "//ns:g[contains(@id,'delete')]" foo.svg > bar.svg
我有一个文件夹,里面有很多 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 文件以去除不需要的标签的任何其他工具?
干杯,多米尼克
SVG 使用名称空间,我认为您必须定义它们:documentation
那么正确的语法应该是:
xmlstarlet ed -N ns=http://www.w3.org/2000/svg -d "//ns:g[contains(@id,'delete')]" foo.svg > bar.svg