2

lxmlの FAQ では、次の情報が提供されています。

XML ツリーを辞書の辞書にマップするにはどうすればよいですか?

私はあなたが尋ねたことをうれしく思います:

def recursive_dict(element):
     return element.tag, \
            dict(map(recursive_dict, element)) or element.text

しかし、これを使用しようとすると、次のようになります。

>>> r = requests.get('http://localhost:8983/solr/admin/cores?action=STATUS')
>>> xml_dict = recursive_dict(lxml.etree.parse(StringIO.StringIO(r.content)))

AttributeError: 'lxml.etree._ElementTree' object has no attribute 'tag'

ElementTree を要素に変換するために欠けているステップはありますか?

4

2 に答える 2

3

lxml.etree.parseElementTreeオブジェクトではなく、オブジェクトを返しElementます。ドキュメントから:

ElementTree は、主にルート ノードを持つツリーのドキュメント ラッパーです。シリアル化と一般的なドキュメント処理のためのいくつかのメソッドを提供します。

ElementTree.getroot()ドキュメントのルート要素を返します。

xml_doc = lxml.etree.parse(StringIO.StringIO(r.content))
xml_dict = recursive_dict(xml_doc.getroot())

編集

recursive_dictおそらくより適しているのは、次のバリエーションです。

def recursive_dict(element):
    retval = {}
    retval["tag"] = element.tag
    if element.text:
        retval["text"] = element.text

    if element.tail:
        retval["tail"] = element.tail

    if element.attrib:
        retval["attributes"] = element.attrib

    if len(element) > 0:
        retval["children"] = [recursive_dict(child_element) for child_element in element]

    return retval
于 2013-10-28T20:37:23.147 に答える