【问题标题】:How to get all the info in XML into dictionary with Python如何使用 Python 将 XML 中的所有信息放入字典中
【发布时间】:2010-07-10 01:45:38
【问题描述】:

假设我有一个如下的 XML 文件。

<A>
 <B>
  <C>"blah"</C>
  <C>"blah"</C>
 </B>
 <B>
  <C>"blah"</C>
  <C>"blah"</C>
 </B>
</A>

我需要将此文件读入类似这样的字典中。

dict["A.B1.C1"] = "废话" dict["A.B1.C2"] = "废话" dict["A.B2.C1"] = "废话" dict["A.B2.C2"] = "废话"

但是dict的格式无关紧要,我只想将所有信息读入Python的变量中。

问题是我不知道 XML 的结构,我只想读取字典中的所有信息。

有没有办法用 Python 做到这一点?

【问题讨论】:

标签: python xml dictionary


【解决方案1】:

您可以在 python 中使用 untangle 库。 untangle.parse() 将 XML 文档转换为 Python 对象

这需要一个 xml 文件作为输入,并返回一个代表该 xml 文档的 python 对象。

我们以下面的xml文件为例,命名为test_xml.xml

<A>
 <B>
  <C>"blah1"</C>
  <C>"blah2"</C>
 </B>
 <B>
  <C>"blah3"</C>
  <C>"blah4"</C>
 </B>
</A>  

现在让我们将上面的xml文件转换成python对象来访问xml文件的元素

>>>import untangle

>>>input_file = "/home/tests/test_xml.xml" #Full path to your xml file
>>>obj = untangle.parse(input_file)

>>>obj.A.B[0].C[0].cdata
u'"blah1"'
>>> obj.A.B[0].C[1].cdata
u'"blah2"'
>>> obj.A.B[1].C[0].cdata
u'"blah3"'
>>> obj.A.B[1].C[1].cdata
u'"blah4"'

【讨论】:

    【解决方案2】:

    我通常使用 lxml.objectify 库进行快速 XML 解析。

    使用您的 XML 字符串,您可以:

    from lxml import objectify
    root = objectify.fromstring(xml_string)
    

    然后使用字典接口获取单个元素:

    value = root["A"][0]["B"][0]["C"][0]
    

    或者,如果您愿意:

    value = root.A[0].B[0].C[0]
    

    【讨论】:

      【解决方案3】:

      我通常使用标准库中的 ElementTree 模块来解析 XML。 它不会给你一个字典,你会得到一个更有用的 DOM 结构,它允许你为子元素迭代每个元素。

      from xml.etree import ElementTree as ET
      
      xml = ET.parse("<path-to-xml-file")
      root_element = xml.getroot()
      
      for child in root_element:
         ...
      

      如果有特殊需要将其解析为字典,而不是从 DOM 树中获取所需的信息,从根节点构建一个递归函数将类似于:

      def xml_dict(node, path="", dic =None):
          if dic == None:
              dic = {}
          name_prefix = path + ("." if path else "") + node.tag
          numbers = set()
          for similar_name in dic.keys():
              if similar_name.startswith(name_prefix):
                  numbers.add(int (similar_name[len(name_prefix):].split(".")[0] ) )
          if not numbers:
              numbers.add(0)
          index = max(numbers) + 1
          name = name_prefix + str(index)
          dic[name] = node.text + "<...>".join(childnode.tail
                                               if childnode.tail is not None else
                                               "" for childnode in node)
          for childnode in node:
              xml_dict(childnode, name, dic)
          return dic
      

      对于您在上面列出的 XML,这会产生这个字典:

      {'A1': '\n \n <...>\n',
       'A1.B1': '\n  \n  <...>\n ',
       'A1.B1.C1': '"blah"',
       'A1.B1.C2': '"blah"',
       'A1.B2': '\n  \n  <...>\n ',
       'A1.B2.C1': '"blah"',
       'A1.B2.C2': '"blah"'}
      

      (我发现 DOM 表单更有用)

      【讨论】:

      • 上面的错字,应该是“getroot()”,而不是“get_root()”
      【解决方案4】:

      查看Really simple way to deal with XML in Python? 的答案,您可能会找到其中一个直接满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多