2009-05-14 20 views
6

Estoy tratando de especificar un espacio de nombres utilizando lxml similar a este ejemplo (tomado de here):Python: la adición de espacios de nombres en lxml

<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
</TreeInventory> 

No estoy seguro de cómo añadir la instancia de esquema de uso y también la ubicación del esquema. El documentation me inició, haciendo algo como:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance' 
>>> TREE = '{%s}' % NS 
>>> NSMAP = {None: NS} 
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP) 
>>> etree.tostring(tree, pretty_print=True) 
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n' 

No estoy seguro de cómo especificar que una instancia sin embargo, y luego también especificar una ubicación. Parece que esto se puede hacer con nsmap keyword-arg en etree.Element, pero no veo cómo.

Respuesta

8

En algunos pasos más, para mayor claridad:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance' 

Por lo que yo puedo ver, es el atributo que desea que se noNameSpaceSchemaLocation de espacios de nombres, no el elemento TreeInventory. Por lo tanto:

>>> location_attribute = '{%s}noNameSpaceSchemaLocation' % NS 
>>> elem = etree.Element('TreeInventory', attrib={location_attribute: 'Trees.xsd'}) 
>>> etree.tostring(elem, pretty_print=True) 
'<TreeInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Trees.xsd"/>\n' 

Esto se parece a lo que quería ... Por supuesto podría también crear el primer elemento, sin atributos, y luego establecer el atributo, como esto:

>>> elem = etree.Element('TreeInventory') 
>>> elem.set(location_attribute, 'Trees.xsd') 

cuanto a el parámetro nsmap: creo que solo se usa para definir qué prefijos usar en la serialización. En este caso, no es necesario, porque lxml sabe que el prefijo comúnmente utilizado para el espacio de nombres en cuestión es "xsi". Si no fuera un espacio de nombres conocido, probablemente vería prefijos como "ns0", "ns1", etc., a menos que haya especificado qué prefijo prefirió. (recuerde: se supone que el prefijo no importa)

+0

Corrección pequeña: debe ser noNamespaceSchemaLocation, no noNameSpaceSchemaLocation. –

Cuestiones relacionadas