Python: добавление пространств имен в lxml

Я пытаюсь указать пространство имен с помощью библиотека lxml подобно этому примеру (взято из здесь):

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

Я не уверен, как добавить экземпляр схема и расположение схемы. The документация заставил меня начать, сделав что-то вроде:

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

Я не уверен, как указать его экземпляр, а затем также указать местоположение. Похоже, это можно сделать с помощью nsmap ключевое слово-arg in etree.Element, но я не вижу как.

1 ответов


еще несколько шагов, для ясности:

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

насколько я вижу, это атрибут noNameSpaceSchemaLocation что вы хотите пространство имен, а не TreeInventory элемент. Итак:

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

это похоже на то, чего вы хотели... Конечно, вы также можете сначала создать элемент без атрибутов, а затем установить атрибут, например:

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

что касается nsmap parameter: я считаю, что он используется только для определения, какие префиксы использовать при сериализации. В этом деле, это не нужно, потому что lxml знает, что обычно используемый префикс для рассматриваемого пространства имен - "xsi". Если бы это было не какое-то известное пространство имен, вы, вероятно, увидели бы префиксы типа "ns0", "ns1" и т. д..., если вы не указали, какой префикс вы предпочитаете. (помните: префикс не должен иметь значения)