lxml FAQs中,它们提供以下内容:


  如何将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转换为元素的步骤?

最佳答案

lxml.etree.parse返回一个ElementTree对象,而不是Element对象。从documentation


  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

关于python - 为什么lxml FAQ中的recursive_dict不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19644391/

10-12 18:14