Как получить всю информацию в XML в словарь с Python - PullRequest
5 голосов
/ 10 июля 2010

Допустим, у меня есть XML-файл следующим образом.

<A>
 <B>
  <C>"blah"</C>
  <C>"blah"</C>
 </B>
 <B>
  <C>"blah"</C>
  <C>"blah"</C>
 </B>
</A>

Мне нужно прочитать этот файл в словарь примерно так.

dict["A.B1.C1"] = "blah"
dict["A.B1.C2"] = "blah"
dict["A.B2.C1"] = "blah"
dict["A.B2.C2"] = "blah"

Но формат dict не имеет значения, я просто хочу прочитать всю информацию в переменные Python.

Дело в том, что я не знаю структуру XML, я просто хочу прочитать всю информацию в словаре.

Есть ли способ сделать это с Python?

Ответы [ 4 ]

5 голосов
/ 10 июля 2010

Обычно я анализирую XML с помощью модуля ElementTree в стандартной библиотеке. Он не дает вам словаря, вы получаете гораздо более полезную структуру DOM, которая позволяет перебирать каждый элемент для детей.

from xml.etree import ElementTree as ET

xml = ET.parse("<path-to-xml-file")
root_element = xml.getroot()

for child in root_element:
   ...

Если есть особая необходимость проанализировать его в словаре, вместо получения необходимой информации из дерева DOM, рекурсивная функция для ее создания из корневого узла будет выглядеть примерно так:

def xml_dict(node, path="", dic =None):
    if dic == None:
        dic = {}
    name_prefix = path + ("." if path else "") + node.tag
    numbers = set()
    for similar_name in dic.keys():
        if similar_name.startswith(name_prefix):
            numbers.add(int (similar_name[len(name_prefix):].split(".")[0] ) )
    if not numbers:
        numbers.add(0)
    index = max(numbers) + 1
    name = name_prefix + str(index)
    dic[name] = node.text + "<...>".join(childnode.tail
                                         if childnode.tail is not None else
                                         "" for childnode in node)
    for childnode in node:
        xml_dict(childnode, name, dic)
    return dic

Для XML, который вы перечислите выше, вы получите этот словарь:

{'A1': '\n \n <...>\n',
 'A1.B1': '\n  \n  <...>\n ',
 'A1.B1.C1': '"blah"',
 'A1.B1.C2': '"blah"',
 'A1.B2': '\n  \n  <...>\n ',
 'A1.B2.C1': '"blah"',
 'A1.B2.C2': '"blah"'}

(я считаю, что форма DOM более полезна)

4 голосов
/ 10 июля 2010

Я обычно использую библиотеку lxml.objectify для быстрого анализа XML.

Со своей строкой XML вы можете сделать:

from lxml import objectify
root = objectify.fromstring(xml_string)

А затем получить отдельные элементы, используя интерфейс словаря:

value = root["A"][0]["B"][0]["C"][0]

Или, если вы предпочитаете:

value = root.A[0].B[0].C[0]
3 голосов
/ 02 октября 2017

Вы можете использовать распутать библиотеку в Python. untangle.parse () преобразует документ XML в объект Python

Это принимает XML-файл в качестве ввода и возвращает объект Python, который представляет этот XML-документ.

Давайте возьмем следующий XML-файл в качестве примера и назовем его test_xml.xml

<A>
 <B>
  <C>"blah1"</C>
  <C>"blah2"</C>
 </B>
 <B>
  <C>"blah3"</C>
  <C>"blah4"</C>
 </B>
</A>  

Теперь давайте преобразуем вышеуказанный xml-файл в объект python для доступа к элементам xml-файла

>>>import untangle

>>>input_file = "/home/tests/test_xml.xml" #Full path to your xml file
>>>obj = untangle.parse(input_file)

>>>obj.A.B[0].C[0].cdata
u'"blah1"'
>>> obj.A.B[0].C[1].cdata
u'"blah2"'
>>> obj.A.B[1].C[0].cdata
u'"blah3"'
>>> obj.A.B[1].C[1].cdata
u'"blah4"'
0 голосов
/ 10 июля 2010

Ознакомьтесь с ответами на Действительно простой способ работы с XML в Python? , вы, вероятно, найдете один из них, который соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...