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