Sto cercando di ottenere una rappresentazione compatta di spazi dei nomi in ElementTree o in lxml quando i sotto elementi si trovano in uno spazio dei nomi diverso come genitore. Ecco l'esempio di base:Noci più compatte ElementTree o 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))
Inoltre ho provato questo approccio:
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 entrambi i casi, ottengo qualcosa di simile a questo:
<country>
<ns0:name xmlns:ns0="urn:test">Canada</ns0:name>
<ns1:population xmlns:ns1="urn:test">34M</ns1:population>
</country>
Mentre questo è corretto, io vorrebbe che fosse meno dettagliato - questo può diventare un problema reale con set di dati di grandi dimensioni (e soprattutto perché sto usando un NS molto più grande di "urna: test").
Se io sono OK con 'paese' essere dentro il "urn: test" spazio dei nomi e dichiararlo in questo modo (nel primo esempio sopra):
country = etree.Element("{test}country")
allora ottengo il seguente output:
<ns0:country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
</ns0:country>
Ma quello che voglio veramente è questo:
<country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
<country>
Tutte le idee?
Grazie! Questo ha funzionato per me. –