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.

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top