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" и т. д..., если вы не указали, какой префикс вы предпочитаете. (помните: префикс не должен иметь значения)