В некотором смысле, вам нужно включить "xs": SCHEMA_NAMESPACE
или что-то подобное в ваш NSMAP - иначе ничто в вашем сгенерированном XML фактически не отображает префикс 'xs' в правильное пространство имен.Это также позволит вам просто указывать имена элементов с префиксами;например, "xs: element".
Что касается вашего основного вопроса, я думаю, что это, вероятно, хорошо, если вы всегда везде используете одно и то же отображение префикса в пространство имен, например, с глобальным * 1004.*.Если вы обрабатываете XML с потенциально произвольными префиксами пространства имен, убедитесь, что либо:
- добавьте свой
nsmap
с префиксом 'xs' к каждому создаваемому элементу;или - используйте атрибут
_Element.nsmap
, чтобы получить карту пространства имен родительского атрибута, инвертировать его и найти соответствующий префикс в инвертированной карте.
Примерпоследний:
SCHEMA_NAMESPACE = "http://www.w3.org/2001/XMLSchema"
def add_element(schema):
nsmap = schema.nsmap
nsrmap = dict([(uri, prefix) for prefix, uri in nsmap.items()])
prefix = nsrmap[SCHEMA_NAMESPACE]
xs = lambda name: "%s:%s" % (prefix, name)
element = schema.makeelement(xs("element"), nsmap=nsmap,
attrib={'name': 'age', 'type': xs('string')})
schema.append(element)
return etree.tostring(schema, pretty_print=True)
Но это, вероятно, излишне для большинства случаев.