在XML中将不同的数据类型从XML加载到字典中

时间:2012-01-12 01:56:59

标签: python xml data-storage

我正在使用cElementTree在循环中提取xml标记和值,然后将它们存储到字典中。

XML文件包含:

<root>
    <tag1>['item1', 'item2']</tag1>
    <tag2>a normal string</tag2>
</root>

Python代码(粗略地):

import xml.etree.cElementTree as xml

xmldata = {}
xmlfile = xml.parse(XMLFile.xml)
for xmltag in xmlfile.iter():
    xmldata[xmltag.tag] = xmltag.text

我遇到的问题是xml文件包含不同的数据类型,包括stringlist。不幸的是,Element.text将所有xml值保存为string(包括列表)。

因此,当我从XML文件加载时,我有:

{'tag1':"['item1', 'item2']", 'tag2':'a normal string'}

当我更喜欢的时候:

{'tag1':['item1', 'item2'], 'tag2':'a normal string'}

有一种简单的方法吗?
例如,以原始格式保存到字典的命令

或者我是否需要设置if语句以确定值类型并使用Element.text的替代方法单独保存?

3 个答案:

答案 0 :(得分:1)

这是一个建议的解决方案:检查是否存在[,然后解析列表。它不是故障安全的(如果分隔符不完全,有空格,它将不起作用)但我认为你很容易改进它。

import xml.etree.cElementTree as xml

xmldata = {}
xmlfile = xml.parse("data.xml")
for xmltag in xmlfile.iter():
    # it's a list
    if "[" in xmltag.text:
        d = xmltag.text.lstrip("[").rstrip("]")
        l = [item.lstrip("'").rstrip("'") for item in d.split(", ")]
        xmldata[xmltag.tag] = l
    else:
        xmldata[xmltag.tag] = xmltag.text

print xmldata

打印:{'root': '\n', 'tag1': ['item1', 'item2'], 'tag2': 'a normal string'}

答案 1 :(得分:1)

您可以使用literal_eval尝试解析复杂的python文字。由于你的strigns是不带引号的,它们会在lteral eval中引发一个SyntaxError,但这可以解决这个问题:

import xml.etree.cElementTree as xml
from ast import literal_eval

xmldata = {}
xmlfile = xml.parse(XMLFile.xml)
for xmltag in xmlfile.iter():
    try:
        xmldata[xmltag.tag] = literal_eval(xmltag.text)
    except SyntaxError:
        xmldata[xmltag.tag] = xmltag.text

与Python的内置“eval”不同,ast.literal_eval不允许执行表达式,因此即使XML数据来自不受信任的来源也是安全的。

答案 2 :(得分:1)

我认为你并没有全力以赴地使用xml!

为什么不组织.xml喜欢:

<root>
    <tag1>
        <item>item1</item>
        <item>item2</item>
    </tag1>
    <tag2>a normal string<tag2>
</root>

这样你的python代码将作为<tag1>的容器处理每个<item>,我认为这样更好。

注意:您可能还想看看here。 (我同意作者的“喜欢的方式”)