如何使用子元素

时间:2019-07-04 17:22:08

标签: python xml python-3.7 minidom

我需要在默认字典中输入XML文件的元素。 使用第一个子元素作为我的键,其他两个值将在列表中。

我试图将元素保留在单独的列表中,然后将它们配对,但仍然没有成功。

下面是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']

相同会使用lineCode和machineName元素

所以我需要一个默认的字典,其输出是这样

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

其中KeylineName标记,value是一个包含2个元素的列表,其值分别为lineCodemachineName

您能建议我一种对xml元素进行迭代以获取上述输出的方法吗? 任何帮助将不胜感激。 谢谢

3 个答案:

答案 0 :(得分:1)

我对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 :(得分:0)

使用volatile boolean myCoolBoolean;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}

答案 2 :(得分:0)

这里

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']}