from lxml import etree
from collections import defaultdict
defetree_to_dict(t):
d ={t.tag:{}if t.attrib elseNone}
children =list(t)if children:
dd = defaultdict(list)for dc inmap(etree_to_dict, children):for k, v in dc.items():
dd[k].append(v)
d ={t.tag:{k:v[0]iflen(v)==1else v for k, v in dd.items()}}if t.attrib:
d[t.tag].update(('@'+ k, v)for k, v in t.attrib.items())if t.text:
text = t.text.strip()if children or t.attrib:if text:
d[t.tag]['#text']= text
else:
d[t.tag]= text
return d
try:basestringexcept NameError:# python3basestring=strdefdict_to_etree(d):def_to_etree(d, root):ifnot d:passelifisinstance(d,basestring):
root.text = d
elifisinstance(d,dict):for k,v in d.items():assertisinstance(k,basestring)if k.startswith('#'):assert k =='#text'andisinstance(v,basestring)
root.text = v
elif k.startswith('@'):assertisinstance(v,basestring)
root.set(k[1:], v)elifisinstance(v,list):for e in v:
_to_etree(e, ET.SubElement(root, k))else:
_to_etree(v, ET.SubElement(root, k))else:raise TypeError('invalid type: '+str(type(d)))assertisinstance(d,dict)andlen(d)==1
tag, body =next(iter(d.items()))
node = ET.Element(tag)
_to_etree(body, node)return ET.tostring(node).decode("utf-8")```
python etree to dict和 dict to etree 互转from lxml import etreefrom collections import defaultdictdef etree_to_dict(t): d = {t.tag: {} if t.attrib else None} children = list(t) if children: dd = defaultdict(list) for dc in map(e