在遍历 XML 文件时创建子列表列表

Create a list of sublist while itiretating through XML file

我的问题如下:我不知道如何使用 lxml 库从 xml 文件创建不同变量的字典。

这是 xml 文件的示例:

  <Patterns>
    <Pattern ID="0" weight="1">
      <PatternEntries>
        <PatternEntry index="0">
          <ShiftType>L</ShiftType>
        </PatternEntry>
        <PatternEntry index="1">
          <ShiftType>D</ShiftType>
        </PatternEntry>
      </PatternEntries>
    </Pattern>
    <Pattern ID="1" weight="1">
      <PatternEntries>
        <PatternEntry index="0">
          <ShiftType>D</ShiftType>
        </PatternEntry>
        <PatternEntry index="1">
          <ShiftType>E</ShiftType>
        </PatternEntry>
      </PatternEntries>
    </Pattern>

我想要创建一个字典,其中模式 ID 作为键,班次类型和日期作为值,看起来像这样:{Pattern ID :[ShiftType]}。问题来自班次列表。所以我在想它创建一个子列表,其中每个 ID 的每个元素都存储在一个子列表中,所有 ID 的所有元素都存储在一个通用列表中。谢谢 !这是我的代码

for ID in root.xpath('//Patterns'):
    pattern_ID = ID.xpath('./Pattern/@ID')
    for shift in root.xpath('.//PatternEntries/PatternEntry/ShiftType'):
        shift_list.append(shift.text)

预期输出:

{0:[L,D], 1:[D,E]}

您可能需要以下内容:

from lxml import etree
patterns = """[your xml above, fixed - it's missing the closing </Patterns>]"""

doc = etree.fromstring(patterns)
p_dict = {}
pat = doc.xpath('//Pattern')
for p in pat:
    key = p.xpath('./@ID')[0]
    vals = p.xpath('.//ShiftType/text()')
    p_dict[key]=vals
p_dict

输出:

{'0': ['L', 'D'], '1': ['D', 'E']}