我有一个XML文件,格式如下:
<doc>
<id name="X">
<type name="A">
<min val="100" id="80"/>
<max val="200" id="90"/>
</type>
<type name="B">
<min val="100" id="20"/>
<max val="20" id="90"/>
</type>
</id>
<type...>
</type>
</doc>
Run Code Online (Sandbox Code Playgroud)
我想解析这个文档并构建一个哈希表
{X: {"A": [(100,80), (200,90)], "B": [(100,20), (20,90)]}, Y: .....}
Run Code Online (Sandbox Code Playgroud)
我将如何在Python中执行此操作?
Ale*_*lli 12
我不同意其他使用minidom的答案中的建议 - 这是一个基本上适用于其他语言的标准的Python改编版,可用但不是很合适.现代Python中推荐的方法是ElementTree.
在第三方模块lxml中也可以更快地实现相同的接口,但除非你需要超快的速度,否则Python标准库中包含的版本很好(并且比minidom还要快) - 关键点是编程到该接口,然后,如果您愿意,您可以随时切换到同一界面的不同实现,只需对您自己的代码进行最少的更改.
例如,在所需的import&c之后,以下代码是您示例的最小实现(它不验证XML是否正确,只是假设正确性提取数据 - 当然添加各种检查非常简单):
from xml.etree import ElementTree as et # or, import any other, faster version of ET
def xml2data(xmlfile):
tree = et.parse(xmlfile)
data = {}
for anid in tree.getroot().getchildren():
currdict = data[anid.get('name')] = {}
for atype in anid.getchildren():
currlist = currdict[atype.get('name')] = []
for c in atype.getchildren():
currlist.append((c.get('val'), c.get('id')))
return data
Run Code Online (Sandbox Code Playgroud)
根据您的样本输入,这会产生您想要的结果.