我需要在默认字典中输入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']}
其中Key
是lineName
标记,value是一个包含2个元素的列表,其值分别为lineCode
和machineName
。
您能建议我一种对xml元素进行迭代以获取上述输出的方法吗? 任何帮助将不胜感激。 谢谢
答案 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']}