Ich versuche, eine kompakte Darstellung von Namespaces in ElementTree oder Lxml, wenn die Unterelemente in einem anderen Namespace als das übergeordnete Element sind. Hier ist das grundlegende Beispiel:Kompakter ElementTree oder Lxml Namespaces
from lxml import etree
country = etree.Element("country")
name = etree.SubElement(country, "{urn:test}name")
name.text = "Canada"
population = etree.SubElement(country, "{urn:test}population")
population.text = "34M"
etree.register_namespace('tst', 'urn:test')
print(etree.tostring(country, pretty_print=True))
Ich habe auch versucht, diesen Ansatz:
ns = {"test" : "urn:test"}
country = etree.Element("country", nsmap=ns)
name = etree.SubElement(country, "{test}name")
name.text = "Canada"
population = etree.SubElement(country, "{test}population")
population.text = "34M"
print(etree.tostring(country, pretty_print=True))
In beiden Fällen bekomme ich so etwas wie diese aus:
<country>
<ns0:name xmlns:ns0="urn:test">Canada</ns0:name>
<ns1:population xmlns:ns1="urn:test">34M</ns1:population>
</country>
Während das ist richtig, ich möchte, dass es weniger ausführlich ist - das kann ein echtes Problem bei großen Datensätzen werden (und insbesondere, weil ich ein viel größeres NS als 'urn: test' verwende).
Wenn ich bin OK mit ‚Land‘ ist in dem „urn: test“ Namespace und erklärt es wie so (im ersten Beispiel oben):
country = etree.Element("{test}country")
dann bekomme ich folgende Ausgabe:
<ns0:country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
</ns0:country>
Aber was ich will, ist wirklich so:
<country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
<country>
Irgendwelche Ideen?
Danke! Das hat für mich funktioniert. –