Скажем, у меня есть 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?
Я обычно разбираю 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 более полезной)
Для быстрого разбора XML я обычно использую библиотеку lxml.objectify.
С вашей строкой 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]
Посмотрите ответы на Действительно простой способ работы с XML в Python?, возможно, вы найдете один из них, непосредственно отвечающий вашим потребностям.