我正在使用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文件包含不同的数据类型,包括string
和list
。不幸的是,Element.text
将所有xml值保存为string
(包括列表)。
因此,当我从XML文件加载时,我有:
{'tag1':"['item1', 'item2']", 'tag2':'a normal string'}
当我更喜欢的时候:
{'tag1':['item1', 'item2'], 'tag2':'a normal string'}
有一种简单的方法吗?
例如,以原始格式保存到字典的命令
或者我是否需要设置if语句以确定值类型并使用Element.text
的替代方法单独保存?
答案 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。 (我同意作者的“喜欢的方式”)