2012-02-15 96 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