Python lxml inkscape namespace tags

Estoy generando un archivo SVG que pretende incluir tags específicas de Inkscape. Por ejemplo, inkscape:label e inkscape:groupmode . Estoy usando lxml etree como mi analizador / generador. Me gustaría agregar las label y groupmode a la siguiente instancia:

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

Mi pregunta es cómo puedo lograr eso para obtener el formulario de salida correcto en el SVG, por ejemplo:

  

Primero, recuerde que inkscape: no es un espacio de nombres, es solo una manera conveniente de referirse a un espacio de nombres que se define en su elemento raíz XML. El espacio de nombres es http://www.inkscape.org/namespaces/inkscape , y dependiendo de su XML, inkscape:groupmode puede ser idéntico a foo:groupmode . Y, por supuesto, su elemento es parte del espacio de nombres SVG, http://www.w3.org/2000/svg . Para generar una salida apropiada con LXML, comenzarías con algo como esto:

 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') 

Lo que te llevaría:

    

Para agregar los atributos específicos de inkscape, harías esto:

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

Lo que te llevaría:

    

Que lo creas o no es exactamente lo que quieres. Puede limpiar un poco las tags de espacio de nombres pasando un parámetro nsmap= al crear su elemento raíz. Me gusta esto:

 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) 

Con esto en su lugar, la salida final se vería así:

    

Más información en la documentación de LXML .