首页 > 解决方案 > 使用 python 解析嵌套的 XML

问题描述

我已经搜索并尝试了用于 XML 数据的 python 库,例如 xml.etree.ElementTree,并从 StackOverflow 和其他网站寻找类似的解决方案。但是,我还没有找到适合我的情况的解决方案。

我拥有的 XML 文件如下所示:

<xmlInfo>
  <NodeName Dn="Santiago_server"/>
  <DataInfo>  
    <Period duration="60" end="2020-11-19 18:00:00"/>
    <measT X="1">CPU</measT>
    <measT X="2">Memory</measT>
    <measT X="3">Disk</measT>
    <measV object="Server#1">
        <P X="1">7</r>
        <P X="2">3</r>
        <P X="3">8</r>
    </measV>
    <measV object="Server#2">
        <P X="1">10</r>
        <P X="2">12</r>
        <P X="3">11</r>
    </measV>
  </DataInfo>
</xmlInfo>

上述 XML 文件的预期结果如下所示:

Date         Time        CPU-Server#1   CPU-Server#2    Memory-Server#1   Memory-Server#2   Disk-Server#1   Disk-Server#2             
2020-11-19   18:00:00         7            10               3                   12               8                11

非常感谢您的反馈。

谢谢

标签: pythonxml-parsing

解决方案


您的 XML 格式有问题。我做了一点修改。不知道能不能满足你的需求。

from simplified_scrapy import SimplifiedDoc, utils, req

xml = '''
<xmlInfo>
  <NodeName Dn="Santiago_server"/>
  <DataInfo>  
    <Period duration="60" end="2020-11-19 18:00:00"/>
    <measT X="1">CPU</measT>
    <measT X="2">Memory</measT>
    <measT X="3">Disk</measT>
    <measV object="Server#1">
        <P X="1">7</P>
        <P X="2">3</P>
        <P X="3">8</P>
    </measV>
    <measV object="Server#2">
        <P X="1">10</P>
        <P X="2">12</P>
        <P X="3">11</P>
    </measV>
  </DataInfo>
</xmlInfo>
'''

doc = SimplifiedDoc(xml)
rows = [['Date','Time', 'CPU-Server#1', 'CPU-Server#2', ' Memory-Server#1', 'Memory-Server#2', 'Disk-Server#1', 'Disk-Server#2']]
for dataInfo in doc.selects('DataInfo'):
    row = []
    period = dataInfo.select('Period>end()').split(' ') # Get date and time
    row.extend(period)
    # measT = dataInfo.selects('measT>text()')
    measVs = dataInfo.selects('measV').selects('P>text()') # Get all P

    for i in range(len(measVs[0])):
        for measV in measVs:
            row.append(measV[i])
    rows.append(row)
print (rows)

推荐阅读