python - Change default namespace of subelement in lxml -
i want generate xml lxml
:
<aroot xmlns="http://a/"> <broot xmlns="http://b/" xmlns:a="http://a/"> <child1/> <child2/> <a:smalltag1/> <a:smalltag2/> </broot> </aroot>
but following code (that seems correct output), not generates above xml.
from lxml import etree lxml.builder import elementmaker ns_a = 'http://a/' ns_b = 'http://b/' = elementmaker(namespace=ns_a, nsmap={none: ns_a, 'b': ns_b}) b = elementmaker(namespace=ns_b, nsmap={none: ns_b, 'a': ns_a}) elem = a.aroot( b.broot( b.child1, b.child2, a.smalltag1, a.smalltag2, ), ) print(etree.tostring(elem, pretty_print=true).decode('ascii'))
this generates:
<aroot xmlns:b="http://b/" xmlns="http://a/"> <b:broot> <b:child1/> <b:child2/> <smalltag1/> <smalltag1/> </b:broot> </aroot>
this valid xml, cannot change default namespace on subelemnt broot
.
if change a
elementmaker
following:
a = elementmaker(namespace=ns_a, nsmap={none: ns_a})
the output becomes:
<aroot xmlns="http://a/"> <broot xmlns="http://b/"> <child1/> <child2/> <smalltag1/> <smalltag2/> </broot> </aroot>
which invalid xml (namespace of smalltag1
b)
and if change both a
, b
follows:
a = elementmaker(namespace=ns_a, nsmap={none: ns_a}) b = elementmaker(namespace=ns_b, nsmap={none: ns_b})
the output is:
<aroot xmlns="http://a/"> <broot xmlns="http://b/"> <child1/> <child2/> <smalltag1 xmlns="http://a/"/> <smalltag2 xmlns="http://a/"/> </broot> </aroot>
which valid, not desired output.
using etree:
from lxml import etree ns_a = 'http://a/' ns_b = 'http://b/' aroot = element('{%s}aroot' % (ns_a), nsmap={none: ns_a}) broot = etree.subelement(aroot, '{%s}broot' % (ns_b), nsmap={none: ns_b, 'a': ns_a}) etree.subelement(broot, '{%s}child1' % (ns_b)) etree.subelement(broot, '{%s}child2' % (ns_b)) etree.subelement(broot, '{%s}smalltag1' % (ns_a)) etree.subelement(broot, '{%s}smalltag2' % (ns_a)) print etree.tostring(aroot, pretty_print=true)
you get:
<aroot xmlns="http://a/"> <broot xmlns:a="http://a/" xmlns="http://b/"> <child1/> <child2/> <a:smalltag1/> <a:smalltag2/> </broot> </aroot>
Comments
Post a Comment