首页 > 解决方案 > 使用子节点解析 xml 并创建 Pandas 数据框

问题描述

我有以下xml格式:

<?xml version="1.0" encoding="UTF-8"?>
<results>
   <run>
      <information>
         <logfile>s.log</logfile>
         <version>33</version>
         <mach>1</mach>
         <problemname>mm1</problemname>
         <timestamp>20201218.165122.053486</timestamp>
      </information>
      <controls>
         <item>VARS</item>
      </controls>
      <result>
         <status>4</status>
         <time>3</time>
         <obj>1.0</obj>
         <gap>0.15</gap>
      </result>
   </run>
</results>

在阅读这篇文章后,我有一个示例代码来解析这个文件如何将 XML 文件转换为漂亮的熊猫数据框?,但它返回无。但是,我的问题是,是否有一种快速的方法来创建一个数据框,该数据框包含来自(即 VARS)值和 4 列(即状态、时间、obj 和间隙)的索引。

import pandas as pd
from xml.etree import ElementTree as et

root = (et.parse('test.xml').getroot()).getchildren()


tags = {"tags":[]}
for elem in root:
    tag = {}
    tag["status"] = elem.attrib['status']
    tag["time"] = elem.attrib['time']
    tag["obj"] = elem.attrib['obj']
    tag["gap"] = elem.attrib['gap']
    tags["tags"]. append(tag)

df_users = pd.DataFrame(tags["tags"])
df_users.head()

这是我正在寻找的输出:


      status  time  obj   gap
VARS  4        3    1.0   0.15

标签: pythonpandasxml-parsing

解决方案


我们可以使用findallfind的方法ElementTree来提取我们需要的元素(result作为列的子元素和controls/item作为索引的元素):

pd.DataFrame({x.tag: x.text for x in et.findall('./run/result//')},
             index = [et.find('./run/controls/item').text])

输出:

     status time  obj   gap
VARS      4    3  1.0  0.15

推荐阅读