Python 将XML解析为哈希表
我有一个XML文件,格式如下:Python 将XML解析为哈希表,python,xml,dom,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"/>
<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>
在Python中如何实现这一点?我建议使用该库 这些文档非常好,所以你应该马上就可以开始运行了
丹。为什么不试试图书馆之类的东西呢。他们有很多文档和教程。另一个XML解析库:
- 解析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>
</doc>
输出:
{'X': {'A': [('100', '80'), ('200', '90')], 'B': [('100', '20'), ('20', '90')]}}
我不同意其他答案中关于使用minidom的建议——这是对最初为其他语言设计的标准的一个非常普通的Python改编,可以使用,但不是很适合。现代Python中推荐的方法是 在第三方模块中也实现了相同的接口,速度更快,但除非您需要极高的速度,否则Python标准库中包含的版本很好(无论如何都比minidom快)——关键是编程到该接口,然后,如果愿意,您可以随时切换到同一接口的不同实现,只需对自己的代码进行最小的更改 例如,在完成所需的导入&c之后,以下代码是示例的最小实现(它不验证XML是否正确,只提取假设正确的数据——添加各种检查当然非常简单):
根据您的示例输入,这将产生您想要的结果。不要重新发明轮子。使用Amara工具包。 无论如何,变量名只是字典中的键。
这种问题已经被问过好几次了。这些答案也许能帮助你解决问题。对不起,我住错房间了。fugly代码竞赛正在进行中。另一个链接-您将得到一个变量doc,该变量有doc.id,它有doc.id.type[0],然后是doc.id.type[0].min。。。等等超级容易访问!警告:挪威蓝鹦鹉综合症:上次发布于5年前。Python 2.5和2.6没有Windows安装程序。
对于节点中的子节点。getchildren():
是不必要的;对节点中的子节点使用:
。警告:xml.etree.ElementTree模块不安全,无法防止恶意构造的数据。如果需要解析不受信任或未经验证的数据,请参阅XML漏洞。只是为了谨慎,我更熟悉BeautifulSoup和解析URL,而不是本地XML文件,所以这对我来说是一个很好的间隙解决方案。
from xml.dom import minidom
data={}
doc=minidom.parse("xml.txt")
for n in doc.childNodes[0].childNodes:
if n.localName=="id":
id_name = n.attributes.item(0).nodeValue
data[id_name] = {}
for j in n.childNodes:
if j.localName=="type":
type_name = j.attributes.item(0).nodeValue
data[id_name][type_name] = [(),()]
for k in j.childNodes:
if k.localName=="min":
data[id_name][type_name][0] = \
(k.attributes.item(1).nodeValue, \
k.attributes.item(0).nodeValue)
if k.localName=="max":
data[id_name][type_name][1] = \
(k.attributes.item(1).nodeValue, \
k.attributes.item(0).nodeValue)
print (data)
{'X': {'A': [('100', '80'), ('200', '90')], 'B': [('100', '20'), ('20', '90')]}}
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