2012-01-12 79 views
1

我使用cElementTree在循环中提取xml标签和值,然后将它们存储到字典中。从XML中将不同的数据类型加载到Python中的字典中

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'} 

是否有一个简单的方法来做到这一点?
e.g,节省了到字典中的原始格式的命令

或者我需要建立if语句来确定值类型和保存它分开使用到Element.text替代?

+0

您能否包含完整的代码片段,包括xmldata的值,以便我们可以重现该问题? – 2012-01-12 02:11:35

+0

@DavidRobinson已更新。 – user788462 2012-01-12 02:31:29

+0

您可能已经能够使用'eval',只是您的字符串没有被XML中的'''包围。 – 2012-01-12 02:58:30

回答

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数据来自不可信来源,也是安全的。

+0

谢谢,这很方便知道。 – user788462 2012-01-16 00:06:11

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

我认为你并没有在它的所有威力中使用xml!

你为什么不组织你.xml这样的:

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

这样,你的Python代码将处理所有的<tag1><item>一个容器,我认为这是更好的。

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

+0

谢谢Rik,很高兴知道我在使用元素的正确轨道:) – user788462 2012-01-16 00:07:26

相关问题