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做到这一点?
您可以在 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)
我通常使用标准库上的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形式更有用)
我通常使用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)