¿Cómo incluir los espacios de nombres en un archivo xml usando lxml?

Estoy creando un nuevo archivo xml desde cero usando python y la biblioteca lxml.

 

Necesito incluir esta información de espacio de nombres en la etiqueta raíz como atributos de la etiqueta de ruta.

No puedo incluir la información en la statement raíz.

 from lxml import etree root = etree.Element("route", xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance", xmlns = "http://www.xxxxx", version = "1.1", xmlns: stm = "http://xxxxx/1/0/0" ) 

hay un SyntaxError: syntax inválida

Cómo puedo hacer eso ?

Aquí es cómo se puede hacer:

 from lxml import etree attr_qname = etree.QName("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation") nsmap = {None: "http://www.xxxx", "stm": "http://xxxx/1/0/0", "xsi": "http://www.w3.org/2001/XMLSchema-instance"} root = etree.Element("route", {attr_qname: "http://xxxx/1/0/0 stm_extensions.xsd"}, version="1.1", nsmap=nsmap) print etree.tostring(root) 

Salida de este código (se han agregado saltos de línea para facilitar la lectura):

  

El “truco” principal es usar QName para crear el xsi:schemaLocation . Un atributo con dos puntos en su nombre no se puede usar como el nombre de un argumento de palabra clave.

He agregado la statement del prefijo xsi a nsmap , pero en realidad se puede omitir. lxml define los prefijos predeterminados para algunos URI de espacio de nombres conocidos, incluido xsi para http://www.w3.org/2001/XMLSchema-instance .