【问题标题】:python lxml inkscape namespace tagspython lxml inkscape 命名空间标签
【发布时间】:2012-11-28 04:04:17
【问题描述】:

我正在生成一个旨在包含 Inkscape 特定标签的 SVG 文件。例如,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">

【问题讨论】:

    标签: python svg lxml inkscape


    【解决方案1】:

    首先,请记住inkscape: 不是命名空间,它只是一种方便的方式来引用定义在 XML 根元素中的命名空间。命名空间是http://www.inkscape.org/namespaces/inkscape,根据您的XML,inkscape:groupmode 可能与foo:groupmode 相同。当然,您的&lt;g&gt; 元素是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 documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      相关资源
      最近更新 更多