繁体   English   中英

python lxml inkscape命名空间标签

[英]python lxml inkscape namespace tags

我正在生成一个SVG文件,该文件旨在包含特定于Inkscape的标记。 例如, inkscape:labelinkscape:groupmode 我使用lxml etree作为我的解析器/生成器。 我想将labelgroupmode标签添加到以下实例中:

layer = etree.SubElement(svg_instance, 'g', id="layer-id")

我的问题是如何实现这一点,以便在SVG中获得正确的输出形式,例如:

<g inkscape:groupmode="layer" id="layer-id" inkscape:label="layer-label">

首先,请记住inkscape: '是一个命名空间,它只是一种引用XML根元素中定义的命名空间的便捷方式。 命名空间是http://www.inkscape.org/namespaces/inkscape ,根据您的XML, inkscape:groupmode可能与foo:groupmode相同。 当然,您的<g>元素是SVG名称空间的一部分, http://www.w3.org/2000/svg 要使用LXML生成适当的输出,您可以从以下内容开始:

from lxml import etree
root = etree.Element('{http://www.w3.org/2000/svg}svg')
g = etree.SubElement(root, '{http://www.w3.org/2000/svg}g', id='layer-id')

哪能得到你:

<ns0:svg xmlns:ns0="http://www.w3.org/2000/svg">
  <ns0:g id="layer-id"/>
</ns0:svg>

要添加特定于inkscape的属性,您可以这样做:

g.set('{http://www.inkscape.org/namespaces/inkscape}groupmode', 'layer')
g.set('{http://www.inkscape.org/namespaces/inkscape}label', 'layer-label')

哪能得到你:

<ns0:svg xmlns:ns0="http://www.w3.org/2000/svg">
  <ns0:g xmlns:ns1="http://www.inkscape.org/namespaces/inkscape" id="layer-id" ns1:groupmode="layer" ns1:label="layer-label"/>
</ns0:svg>

信不信由你想要的是什么。 在创建根元素时,可以通过传递nsmap=参数来清理命名空间标签。 像这样:

NSMAP = {
  None: 'http://www.w3.org/2000/svg',
'inkscape': 'http://www.inkscape.org/namespaces/inkscape',
}

root = etree.Element('{http://www.w3.org/2000/svg}svg', nsmap=NSMAP)

有了这个,最终输出将如下所示:

<svg xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns="http://www.w3.org/2000/svg">
  <g id="layer-id" inkscape:label="layer-label" inkscape:groupmode="layer"/>
</svg>

LXML文档中的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM