Python 使用子节点解析xml并创建数据帧
我有以下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 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