Мне нужно ввести элементы файла XML в словарь по умолчанию. Используя первый дочерний элемент в качестве моего ключа, и другие 2 значения будут в списке.

Я пытался сохранить элементы в отдельном списке, а затем объединить их, но все равно безуспешно.

Ниже приведена структура XML

<lines>
    <line>
        <lineName>'Line 1'</lineName>
        <lineCode>'5501'</lineCode>
        <machineName>'Line_1'</machineName>
    </line>
    <line>
        <lineName>'Line 2'</lineName>
        <lineCode>'5502'</lineCode>
        <machineName>'Line_2'</machineName>
    </line>
</lines>

Вот как я получаю элементы

item = myxmlcfg.getElementsByTagName('lineName')

Элемент представляет собой список из 2 элементов

item['Line 1', 'Line 2']

То же самое произойдет с элементами кода строки и имени машины

Поэтому мне нужен словарь по умолчанию с выводом, как это

lines {'Line 1': ['5501', 'Line_1'], 'Line 2':['5502', 'Line_2']}

Где Key - тег lineName, а значение - список из 2 элементов, значениями которых являются lineCode и machineName.

Можете ли вы предложить мне способ перебора элементов xml для получения вывода, как указано выше? Любая помощь будет оценена. Благодарность

0
Javier Ramirez 4 Июл 2019 в 20:22

3 ответа

Лучший ответ

У меня нет опыта работы с minidom, но с ElementTree это тривиальная задача:

from xml.etree import ElementTree as ET
from xml.etree.ElementTree import ElementTree

if __name__ == '__main__':

    xml_raw = '''
    <lines>
        <line>
            <lineName>'Line 1'</lineName>
            <lineCode>'5501'</lineCode>
            <machineName>'Line_1'</machineName>
        </line>
        <line>
            <lineName>'Line 2'</lineName>
            <lineCode>'5502'</lineCode>
            <machineName>'Line_2'</machineName>
        </line>
    </lines>
    '''

    root: ElementTree = ET.fromstring(xml_raw)
    lines = {}
    for line in root.findall('line'):
        name = line.findtext('lineName').strip("'")
        code = line.findtext('lineCode').strip("'")
        machine = line.findtext('machineName').strip("'")
        lines[name] = [code, machine]
    print(lines)

Выход:

{'Line 1': ['5501', 'Line_1'], 'Line 2': ['5502', 'Line_2']}
1
abdusco 4 Июл 2019 в 17:32

Вот

import xml.etree.ElementTree as ET

xml = '''<lines>
    <line>
        <lineName>'Line 1'</lineName>
        <lineCode>'5501'</lineCode>
        <machineName>'Line_1'</machineName>
    </line>
    <line>
        <lineName>'Line 2'</lineName>
        <lineCode>'5502'</lineCode>
        <machineName>'Line_2'</machineName>
    </line>
</lines>'''

root = ET.fromstring(xml)
lines = root.findall('.//line')


  data = {
line.find('lineName').text.strip("'"): [line.find('lineCode').text.strip("'"), line.find('machineName').text.strip("'")]
for line in lines}

Печать (данные )

Выход

{'Line 1': ['5501', 'Line_1'], 'Line 2': ['5502', 'Line_2']}
0
balderman 4 Июл 2019 в 18:11

Используя lxml.etree и Element.itersiblings():

from lxml import etree

root=etree.fromstring(xml)
item=root.findall(f'.//lineName')
lines={i.text.strip("'"): [s.text.strip("'") for s in i.itersiblings()] for i in item}

Выход:

{'Line 1': ['5501', 'Line_1'], 'Line 2': ['5502', 'Line_2']}
0
Ricky Kim 4 Июл 2019 в 17:38