Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用子节点解析xml并创建数据帧_Python_Pandas_Xml Parsing - Fatal编程技术网

Python 使用子节点解析xml并创建数据帧

Python 使用子节点解析xml并创建数据帧,python,pandas,xml-parsing,Python,Pandas,Xml Parsing,我有以下xml格式: <?xml version="1.0" encoding="UTF-8"?> <results> <run> <information> <logfile>s.log</logfile> <version>33</version> <mach>1</m

我有以下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>
这是我正在寻找的输出:


      status  time  obj   gap
VARS  4        3    1.0   0.15

我认为您仍然需要通过etree循环以使用xml提取比特和片段

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

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

results = []
for ele in eles.findall('run'):
    # assumed each run contains only one control item 
    control = ele.find('controls').find('item').text
    # extract each run result and save it in the results 
    for attr in list(ele.find('result')):
        result = {}
        result['control'] = control
        result[attr.tag] = attr.text
        results.append(result)
# at last, convert into dataframe and set control as index 
results = pd.DataFrame(results)
results = results.set_index('control')

我们可以使用
ElementTree
findall
find
方法来提取我们需要的元素(
result
的子元素作为列,而
控件/项作为索引):

输出:

     status time  obj   gap
VARS      4    3  1.0  0.15

注意,status不在root下,但您正试图在root下找到它

状态
位于父级
结果

您需要递归地检查子项下的状态


请参阅。通过实例详细介绍了这些方法
findall
如其他人所建议的那样非常有用。

etree输出对您有什么好处?我们有点不关心xml,我们关心etree的输出,因为这正是您试图创建df的原因。此外,请注意您的xml格式不正确-例如,
关闭在哪里?@JackFleeting。谢谢刚刚更新。@noah谢谢分享这篇文章。根据这个更新了我的问题。
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