Python: l'ajout d'espaces de noms dans lxml
-
21-08-2019 - |
Question
Je suis en train de spécifier un espace de noms en utilisant lxml similaire à cet exemple (prise ici ):
<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 à utiliser et aussi l'emplacement du schéma. 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 mot-clé dans arg nsmap
etree.Element
, mais je ne vois pas comment.
La solution
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 que vous voulez noNameSpaceSchemaLocation
espaces de noms, pas l'élément TreeInventory
. Donc:
>>> 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 est pas nécessaire, parce que lxml connaît le préfixe couramment utilisé pour l'espace de noms en question est « xsi ». S'il n'y avait pas un nom d'espace bien connu, vous auriez probablement voir des préfixes comme « ns0 », « NS1 » etc ..., à moins que vous avez spécifié que vous préfixe préféré. (Rappelez-vous: le préfixe est pas censé à la matière)