Próbuję uzyskać zwartą reprezentację przestrzeni nazw w ElementTree lub LXML, gdy elementy podrzędne są w innej przestrzeni nazw jako obiekt nadrzędny. Oto prosty przykład:Bardziej zwarte przestrzenie nazw ElementTree lub lxml
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))
Próbowałem też to podejście:
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))
w obu przypadkach, że coś takiego się:
<country>
<ns0:name xmlns:ns0="urn:test">Canada</ns0:name>
<ns1:population xmlns:ns1="urn:test">34M</ns1:population>
</country>
Mimo, że jest poprawny, I chciałbym, żeby było mniej gadatliwe - może to stanowić poważny problem z dużymi zbiorami danych (zwłaszcza, że używam znacznie większego NS niż "urn: test").
Jeśli jestem OK z „kraju” bycia wewnątrz „urn: Test” nazw i zadeklarować je jak tak (w pierwszym przykładzie powyżej):
country = etree.Element("{test}country")
następnie pojawia się następujący komunikat:
<ns0:country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
</ns0:country>
Ale to, co naprawdę chcę to:
<country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
<country>
Jakieś pomysły?
Dzięki! To działało dla mnie. –