如何使用Python将XML中的所有信息都放入字典中

pro*_*eek 5 python xml dictionary

假设我有一个XML文件,如下所示.

<A>
 <B>
  <C>"blah"</C>
  <C>"blah"</C>
 </B>
 <B>
  <C>"blah"</C>
  <C>"blah"</C>
 </B>
</A>
Run Code Online (Sandbox Code Playgroud)

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

dict["A.B1.C1"] = "blah"
dict["A.B1.C2"] = "blah"
dict["A.B2.C1"] = "blah"
dict["A.B2.C2"] = "blah"

但是dict的格式并不重要,我只想将所有信息都读入Python的变量中.

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

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

Ysh*_*Ysh 6

您可以在 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>  
Run Code Online (Sandbox Code Playgroud)

现在让我们将上面的 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"'
Run Code Online (Sandbox Code Playgroud)


jsb*_*eno 5

我通常使用标准库上的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:
   ...
Run Code Online (Sandbox Code Playgroud)

如果有特殊需要将其解析为字典,而不是从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
Run Code Online (Sandbox Code Playgroud)

对于上面列出的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"'}
Run Code Online (Sandbox Code Playgroud)

(我发现DOM形式更有用)

  • 上面的错字,应该是"getroot()",而不是"get_root()" (2认同)

Lio*_*ior 5

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

使用您的 XML 字符串,您可以执行以下操作:

from lxml import objectify
root = objectify.fromstring(xml_string)
Run Code Online (Sandbox Code Playgroud)

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

value = root["A"][0]["B"][0]["C"][0]
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢:

value = root.A[0].B[0].C[0]
Run Code Online (Sandbox Code Playgroud)