当子元素与父元素位于不同的命名空间时,我试图在 ElementTree 或 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) )
我也尝试过这种方法:
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) )
在这两种情况下,我都会得到这样的结果:
<country>
<ns0:name xmlns:ns0="urn:test">Canada</ns0:name>
<ns1:population xmlns:ns1="urn:test">34M</ns1:population>
</country>
虽然这是正确的,但我希望它不那么冗长 - 这可能成为大型数据集的一个真正问题(特别是因为我使用的 NS 比“urn:test”大得多)。
如果我对“国家”在“urn:test”命名空间内感到满意并像这样声明它(在上面的第一个示例中):
country = etree.Element("{test}country")
然后我得到以下输出:
<ns0:country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
</ns0:country>
但我真正想要的是:
<country xmlns:ns0="urn:test">
<ns0:name>Canada</ns0:name>
<ns0:population>34M</ns0:population>
<country>
有任何想法吗?