Python: добавление пространств имен в lxml - PullRequest
6 голосов
/ 14 мая 2009

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

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

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

>>> 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 в etree.Element, но я не понимаю, как это сделать.

1 Ответ

8 голосов
/ 14 мая 2009

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

>>> 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: я считаю, что он используется только для определения того, какие префиксы использовать при сериализации. В этом случае это не требуется, поскольку lxml знает, что обычно используемый префикс для рассматриваемого пространства имен - «xsi». Если бы это не было какое-то известное пространство имен, вы бы, вероятно, увидели префиксы типа «ns0», «ns1» и т. Д., Если только вы не указали, какой префикс вы предпочитаете. (помните: префикс не имеет значения)

...