2009-05-14 13 views
6

Je suis en train de spécifier un espace de noms à l'aide lxml similaire à cet exemple (pris de here):Python: l'ajout d'espaces de noms dans lxml

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

Je ne sais pas comment ajouter l'instance de schéma à utilisez et aussi l'emplacement du schéma. Le documentation m'a lancé, en faisant quelque chose comme:

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

Je ne sais pas comment le spécifier une instance bien, puis spécifiez également un emplacement. Il semble que cela peut être fait avec le nsmap keyword-arg en etree.Element, mais je ne vois pas comment.

Répondre

8

Dans quelques marches, pour plus de clarté:

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

Pour autant que je peux voir, il est l'attribut noNameSpaceSchemaLocation que vous voulez espaces de noms, pas l'élément TreeInventory. Alors:

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

Cela ressemble à ce que vous vouliez ... Vous pouvez bien sûr créer aussi l'élément premier, sans attributs, puis définissez l'attribut, comme ceci:

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

En ce qui concerne le paramètre nsmap: Je crois qu'il est seulement utilisé pour définir les préfixes à utiliser sur la sérialisation. Dans ce cas, il n'est pas nécessaire, car lxml sait que le préfixe couramment utilisé pour l'espace de noms en question est "xsi". Si ce n'était pas un espace de noms bien connu, vous verriez probablement des préfixes comme "ns0", "ns1" etc ..., sauf si vous avez spécifié quel préfixe vous préférez. (rappelez-vous: le préfixe n'est pas supposé importer)

+0

Juste une petite correction: Doit être noNamespaceSchemaLocation, no noNameSpaceSchemaLocation. –