Когда вы добавляете новый элемент, связанный с другим пространством имен, объявление для этого пространства имен будет вставлено автоматически при сериализации файла XML. По умолчанию объявление не отображается в корневом элементе, и префикс может не соответствовать желаемому.
Демонстрация:
from lxml import etree
# Parse original XML
orig_xml = '<kml xmlns="http://www.opengis.net/kml/2.2"/>'
root = etree.fromstring(orig_xml)
ns = "http://www.google.com/kml/ext/2.2"
# Add new element in other namespace as child of root
test = etree.SubElement(root, etree.QName(ns, "drawOrder"))
print(etree.tostring(root, pretty_print=True).decode())
Вывод:
<kml xmlns="http://www.opengis.net/kml/2.2">
<ns0:drawOrder xmlns:ns0="http://www.google.com/kml/ext/2.2"/>
</kml>
Это очень хороший, правильно сформированный XML-документ, но он, вероятно, не совсем то, что вам нужно. Это можно исправить с помощью cleanup_namespaces()
. Добавьте следующую строку перед вызовом print()
:
etree.cleanup_namespaces(root, top_nsmap={"gx": ns})
Новый вывод:
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
<gx:drawOrder/>
</kml>