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

Я пытаюсь написать питон скрипт, который будет раздеться всю соответствующую информацию и поместить его в словарь, так что я могу посмотреть значения по ключу. В настоящее время мой код может содержать только одно измерение - это означает, что в моем 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': 'Добавить', 'partnumber': 1223, 'partname': 'Battery', 'partdescription': 'Holds charge'}, {'command': 'Add', ' 'partnumber': 4444, 'partname': 'Pump', 'partdescription': 'Pumps stuff'}] '. Что-то в этом духе подходит вам? –

+0

Это в основном то, что я пытался выполнить. Таким образом, я мог бы легко получить доступ к любому из отдельных клавиш действия. – user1130161

ответ

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

+0

@ user1130161 У меня есть Python 2.7. Компонент ['xml.etree.ElementTree'] (http://docs.python.org/library/xml.etree.elementtree.html) является новым в Python 2.5 и, как представляется, имел различные изменения в Python 2.7. –

+0

Я избавился от ошибок, изменив импорт на: 'из lxml import etree', а затем' xmlFile = "parts.xml" context = etree.parse (xmlFile) действия = context.findall ('action') parsed = [{field.tag: field.text для поля в действии} для действия в действиях] ' – user1130161

Смежные вопросы