【问题标题】:How to parse XML and store as a list ( python)如何解析 XML 并存储为列表(python)
【发布时间】:2018-07-23 12:51:36
【问题描述】:

对不起,我又要问了。

我想通过xml.etree.ElementTree将xml文件转换为excel。

假设我的 xml 看起来像:

<ParameterCluster>
          <Name>AAAAAA</Name>
          <ParameterDefinitionList>
            <ParameterDefinition>
              <Name>LengthMin</Name>
              <Type>UInt8</Type>
            </ParameterDefinition>
            <ParameterDefinition>
              <Name>LengthMax</Name>
              <Type>UInt8</Type>
            </ParameterDefinition>
          </ParameterDefinitionList>

          <VariantImlementationList>
            <VariantImlementation>
              <MajorVariantList>
                <MajorVariant>A_Basis</MajorVariant>
              </MajorVariantList>
              <MinorVariantList>
                        <ParameterValue>
                          <ValueList>
                            <Value>47</Value>
                          </ValueList>
                          <ValueList>
                            <Value>80</Value>
                          </ValueList>
                        </ParameterValue>
              </MinorVariantList>
              <MajorVariantList>
                <MajorVariant>B_Basis</MajorVariant>
                <MajorVariant>C_Basis</MajorVariant>
              </MajorVariantList>
              <MinorVariantList>
                        <ParameterValue>
                          <ValueList>
                            <Value>47</Value>
                          </ValueList>
                          <ValueList>
                            <Value>40</Value>
                          </ValueList>
                        </ParameterValue>
              </MinorVariantList> 
            </VariantImlementation>
          </VariantImlementationList>
        </ParameterCluster>

也就是说,我有3 基础(A_basisB_basisC_basis)。

A_ Basis 中,LengthMin 的值为47LengthMax 的值为80

但在B_basisC_Basis 中。 LengthMin 的值为47LengthMax 的值为40

所以我想得到类似的东西:

{'AAAAAA','LengthMin','UInt8','A_Basis',47}
{'AAAAAA','LengthMax','UInt8','A_Basis',80}
{'AAAAAA','LengthMin','UInt8','B_Basis',47}
{'AAAAAA','LengthMax','UInt8','B_Basis',40}
{'AAAAAA','LengthMin','UInt8','C_Basis',47}
{'AAAAAA','LengthMax','UInt8','C_Basis',40}

然后我可以将它写入excel文件。有可能得到这样的清单吗?

【问题讨论】:

  • 您确定这是有效的 XML 吗?例如,拳头 没有关闭。
  • 嗨,安德烈·凯塞利。对不起今天是我使用stackoverflow的第一天。我已经在我的问题中更改了它。

标签: python xml excel elementtree


【解决方案1】:

解析XML可以使用BeautifulSoup代替xml.etree.ElementTree(界面更直观)。

解析很简单(假设ParameterValue的长度始终与ParameterValue.ValueList相同:首先需要提取参数类型,然后遍历所有&lt;MajorVariant&gt;并填充结果列表。

如果 BeautifulSoup 没有问题,这里是示例代码:

data = """<ParameterCluster>
              <Name>AAAAAA</Name>
              <ParameterDefinitionList>
                <ParameterDefinition>
                  <Name>LengthMin</Name>
                  <Type>UInt8</Type>
                </ParameterDefinition>
                <ParameterDefinition>
                  <Name>LengthMax</Name>
                  <Type>UInt8</Type>
                </ParameterDefinition>
              </ParameterDefinitionList>

              <VariantImlementationList>
                <VariantImlementation>
                  <MajorVariantList>
                    <MajorVariant>A_Basis</MajorVariant>
                  </MajorVariantList>
                  <MinorVariantList>
                            <ParameterValue>
                              <ValueList>
                                <Value>47</Value>
                              </ValueList>
                              <ValueList>
                                <Value>80</Value>
                              </ValueList>
                            </ParameterValue>
                  </MinorVariantList>
                  <MajorVariantList>
                    <MajorVariant>B_Basis</MajorVariant>
                    <MajorVariant>C_Basis</MajorVariant>
                  </MajorVariantList>
                  <MinorVariantList>
                            <ParameterValue>
                              <ValueList>
                                <Value>47</Value>
                              </ValueList>
                              <ValueList>
                                <Value>40</Value>
                              </ValueList>
                            </ParameterValue>
                  </MinorVariantList>
                </VariantImlementation>
              </VariantImlementationList>
            </ParameterCluster>"""


from bs4 import BeautifulSoup
from pprint import pprint

soup = BeautifulSoup(data, 'xml')

name, types = soup.select_one('Name'), []
for n, t in zip(soup.select('ParameterDefinitionList Name'), soup.select('ParameterDefinitionList Type')):
    types.append([name.text, n.text, t.text])

rv = []
for major, minor in zip(soup.select('MajorVariantList'), soup.select('MajorVariantList ~ MinorVariantList')):
    for mj in major.select('MajorVariant'):
        for i, mn in enumerate(minor.select('Value')):
            rv.append(types[i] + [mj.text, mn.text])

pprint(rv, width=120)

输出:

[['AAAAAA', 'LengthMin', 'UInt8', 'A_Basis', '47'],
 ['AAAAAA', 'LengthMax', 'UInt8', 'A_Basis', '80'],
 ['AAAAAA', 'LengthMin', 'UInt8', 'B_Basis', '47'],
 ['AAAAAA', 'LengthMax', 'UInt8', 'B_Basis', '40'],
 ['AAAAAA', 'LengthMin', 'UInt8', 'C_Basis', '47'],
 ['AAAAAA', 'LengthMax', 'UInt8', 'C_Basis', '40']]

【讨论】:

  • 谢谢安德烈·凯塞利。我现在正在安装 BeautifulSoup 和 pprint 包。我会在我的脚本中尝试它。太棒了,谢谢。祝你有美好的一天。
  • 嗨,安德烈·凯塞利。我把我的脚本写成:infile = open("ALL.xml","r")contents = infile.read()soup = BeautifulSoup(contents,'xml') 然后这个错误给出:UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 2034240: character maps to 对不起,我对此一无所知。你以前有没有遇到过?
  • @syo 正在编码 eroor,您的文件可能包含一些奇怪的字符。看看 StackOverflow 如何正确解码/编码字符串。
  • 嗨,安德烈·凯塞利。它成功了,看起来真的很好。谢谢你&抱歉迟到的反馈。美好的一天。
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多