2009-05-14 16 views
6

Sto cercando di specificare uno spazio dei nomi utilizzando lxml simile a questo esempio (tratto da here):Python: l'aggiunta di spazi dei nomi in lxml

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

Non sono sicuro di come aggiungere l'istanza dello schema di utilizzare e anche la posizione dello schema. Il documentation mi ha iniziato, facendo qualcosa di simile:

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

Non sono sicuro di come specificare che un'istanza però, e poi anche specificare una posizione. Sembra che questo possa essere fatto con la parola chiave nsmap in etree.Element, ma non vedo come.

risposta

8

In alcuni altri passi, per chiarezza:

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

Per quanto posso vedere, è l'attributo che si desidera noNameSpaceSchemaLocation namespace, non l'elemento TreeInventory. Quindi:

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

questo appare come quello che volevi ... Si potrebbe naturalmente anche creare il primo elemento, senza attributi, e quindi impostare l'attributo, in questo modo:

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

Per quanto riguarda il parametro nsmap: credo che sia usato solo per definire quali prefissi usare sulla serializzazione. In questo caso, non è necessario, perché lxml sa che il prefisso comunemente utilizzato per lo spazio dei nomi in questione è "xsi". Se non fosse uno spazio dei nomi noto, probabilmente vedresti prefissi come "ns0", "ns1" ecc ..., a meno che non hai specificato il prefisso che preferisci. (ricorda: il prefisso non dovrebbe avere importanza)

+0

Piccola correzione: dovrebbe essere noNamespaceSchemaLocation, no noNameSpaceSchemaLocation. –