将XML解析为哈希表

use*_*536 4 python xml dom

我有一个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)

根据您的样本输入,这会产生您想要的结果.