2012-02-15 73 views
1

我有一个python脚本,用于解析包含部分信息的XML文件以及脚本应该对信息执行的命令。Python中的多维字典

<?xml version="1.0"?> 
<servicexml> 
    <action> 
     <command>Add</command> 
     <partnumber>1223</partnumber> 
     <partname>Battery</partname> 
     <partdescription>Holds charge</partdescription> 
    </action> 

    <action> 
     <command>Add</command> 
     <partnumber>4444</partnumber> 
     <partname>Pump</partname> 
     <partdescription>Pumps stuff</partdescription> 
    </action> 

</servicexml> 

我试图写一个Python脚本,将去掉所有相关信息,并把它变成一本字典,所以我可以通过键查找值。目前,我的代码只能保存一个维度 - 这意味着在我的XML文件中,最后一个标记是写入的唯一值。如何在我的字典中动态分配维度以保存来自XML文件的多个操作?这样我可以访问每个零件序列的关键值。

基于大卫艾伯的回答:

我不得不改变部分进口模块但是他的方法仍然使用这里是我的Python代码

from lxml import etree 
from StringIO import StringIO 

actionInformation = [] 
tagsOfInterest = ['command','partnumber','partname','partdescrip'] 
tagDataOfIntrest = {} 
xmlFile = "parts.xml" 
context = etree.iterparse(xmlFile) 

for action, elem in context: 
    if elem.tag in tagsOfInterest: 
     actionInformation.append([elem.tag,elem.text]) 

tagDataOfInterest = dict(actionInformation)  
print tagDataOfInterest 

解决方案。

from lxml import etree 
xmlFile = "parts.xml" 
context = etree.parse(xmlFile) 
actions = context.findall('action') 

parsed = [{field.tag: field.text for field in action} for action in actions] 

+0

您可以创建词典,其中每个列表元素对应于'action's的一个列表。例如,你应该有'[{'command':'Add','partnumber':1223,'partname':'Battery','partdescription':'Holds charge'},{'command':'Add', 'partnumber':4444,'partname':'Pump','partdescription':'Pumps stuff'}]'。有没有像这样的声音对你有好处? – 2012-02-15 16:38:06

+0

这基本上是我试图完成的。通过这种方式,我可以轻松访问任何个人操作键 – user1130161 2012-02-15 16:41:37

回答

2

这是一种可行的方法。它不会使partnumber元素整数,但它看起来不像你这样做。不过,修改它并不会太麻烦。

from xml.etree.ElementTree import ElementTree 

tree = ElementTree() 
tree.parse(xmlFile) 
actions = tree.findall('action') 

parsed = [{field.tag: field.text for field in action} for action in actions] 

设施齐全的例子

这里是一个完全包含例如以方便核查。区别在于上面的xmlFile已被替换为StringIO对象。

import StringIO 
from xml.etree.ElementTree import ElementTree 

s = """<?xml version="1.0"?> 
<servicexml> 
    <action> 
     <command>Add</command> 
     <partnumber>1223</partnumber> 
     <partname>Battery</partname> 
     <partdescription>Holds charge</partdescription> 
    </action> 

    <action> 
     <command>Add</command> 
     <partnumber>4444</partnumber> 
     <partname>Pump</partname> 
     <partdescription>Pumps stuff</partdescription> 
    </action> 

</servicexml>""" 

st = StringIO.StringIO(s) 

tree = ElementTree() 
tree.parse(st) 
actions = tree.findall('action') 

parsed = [{field.tag: field.text for field in action} for action in actions] 

运行此之后,你可以做

>>> parsed 
[{'command': 'Add', 
    'partdescription': 'Holds charge', 
    'partname': 'Battery', 
    'partnumber': '1223'}, 
{'command': 'Add', 
    'partdescription': 'Pumps stuff', 
    'partname': 'Pump', 
    'partnumber': '4444'}] 
+0

您使用的是什么版本的Python?由于某种原因,它无法找到etree.ElementTree – user1130161 2012-02-15 17:05:56

+0

@ user1130161我有Python 2.7。 ['xml.etree.ElementTree'](http://docs.python.org/library/xml.etree.elementtree.html)组件在Python 2.5中是新的,并且似乎在Python 2.7中进行了各种更改。 – 2012-02-15 17:10:25

+0

我通过将导入更改为:'from lxml import etree',然后'xmlFile =“parts.xml”012xxcontext = etree.parse(xmlFile) actions = context.findall('action') parsed = [{field.tag:field.text for field in action} for action in action]' – user1130161 2012-02-15 17:18:13