4

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">
4

1 に答える 1

9

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 ドキュメントを参照してください。

于 2012-12-10T17:59:54.357 に答える