2014-10-31 3 views
3

В StackOverflow существует множество решений для преобразования XML в словарь Python, но ни один из них не генерирует результат, который я ищу. У меня есть следующий XML:Преобразование XML в словарь в Python с использованием lxml

<?xml version="1.0" encoding="UTF-8"?> 
<status xmlns:mystatus="http://localhost/mystatus"> 
<section1 
    mystatus:field1="data1" 
    mystatus:field2="data2" /> 
<section2 
    mystatus:lineA="outputA" 
    mystatus:lineB="outputB" /> 
</status> 

lxml has an elegantly simple solution для преобразования XML в словарь:

def recursive_dict(element): 
return element.tag, dict(map(recursive_dict, element)) or element.text 

К сожалению, я получаю:

('status', {'section2': None, 'section1': None}) 

вместо:

('status', {'section2': 
         {'field1':'data1','field2':'data2'}, 
      'section1': 
         {'lineA':'outputA','lineB':'outputB'} 
      }) 

Я не могу изобразить e, как получить желаемый результат без существенного усложнения функции recursive_dict().

Я не привязан к lxml, и я также прекрасно разбираюсь в другой организации словаря, если он дает мне всю информацию в xml. Благодаря!

+0

Из любопытства, почему вы ожидаете получить атрибуты разделов, но не атрибуты статуса? Какая магия позволяет библиотеке знать, что вы хотите? И ... есть ли какая-то причина, почему содержание разделов - это атрибуты, а не элементы? – GreenAsJade

+0

XML поставляется с источником, который я не контролирую. Мне нужно иметь возможность потреблять его и действовать на нем. Вот почему я сказал, что буду «отлично с другой организацией словаря». Моя цель - получить всю информацию - будь то тег, текст, атрибут, что угодно - в простую структуру, такую ​​как словарь. Никакой «магии» не требуется. Значения «Нет» в порядке. Я просто хочу, чтобы вся информация в захваченном XML. – proximous

+0

Похоже, у вас есть решение, но я просто хочу отметить, что желаемый результат, который вы показали, не показывает _ALL_ полученную информацию. Он показывает атрибуты захваченных секций, но не атрибуты статуса. – GreenAsJade

ответ

9

Лично мне нравится xmltodict от here. На linux вы можете установить его с помощью pip install xmltodict.

Обратите внимание, что это фактически создает OrderedDict объектов. Пример использования:

import xmltodict as xd 

with open('test.xml','r') as f: 
    d = xd.parse(f) 
+0

Хотя я бы предпочел не устанавливать ничего лишнего, это очень просто и похоже, что он будет работать, поэтому я попробую. Благодаря! – proximous

+0

Это отлично работает! Я предпочитаю переформатировать его с помощью d = ast.literal_eval (json.dumps (d)) после разбора, но выход по умолчанию сохраняет все идеально для меня! Благодаря! – proximous

+1

Имейте в виду xmltodict при работе с большими xmls. xmltodict использует модуль python xml из стандартной библиотеки. Он становится очень медленным, когда xml> 1 ГБ. Вместо этого используйте lxml – AlexanderLedovsky

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