"""Util functions used by Netdisco."""
|
|
from collections import defaultdict
|
|
|
|
|
|
# Taken from http://stackoverflow.com/a/10077069
|
|
# pylint: disable=invalid-name
|
|
def etree_to_dict(t):
|
|
"""Convert an ETree object to a dict."""
|
|
# strip namespace
|
|
tag_name = t.tag[t.tag.find("}")+1:]
|
|
|
|
d = {tag_name: {} if t.attrib else None}
|
|
children = list(t)
|
|
if children:
|
|
dd = defaultdict(list)
|
|
for dc in map(etree_to_dict, children):
|
|
for k, v in dc.items():
|
|
dd[k].append(v)
|
|
d = {tag_name: {k: v[0] if len(v) == 1 else v for k, v in dd.items()}}
|
|
if t.attrib:
|
|
d[tag_name].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[tag_name]['#text'] = text
|
|
else:
|
|
d[tag_name] = text
|
|
return d
|