首页 > 解决方案 > 将xml数据转换为数据框

问题描述

假设我有一个这样的 XML:

<Rules>
       <Set Parameter="4" To="90">
             <If Parameter="1087" EqualsTo="90" />
        </Set>
        <Set Parameter="5" To="-5">
             <If Parameter="1087" EqualsTo="87" />
        </Set>
        <Set Parameter="6" To="[-5,23;36,7;58,7;78,8;94,47]">
             <If Parameter="1087" EqualsTo="87" />
         </Set>
         <Set Parameter="14" To="7,5" />
         <Set Parameter="15" To="-7,5" />
         <Set Parameter="16" To="0,5" />
         <Set Parameter="17" To="3" />
         <Set Parameter="18" To="-3" />
             <If Parameter="1087" EqualsTo="87" />
         </Set>
 </Rules> 

我想阅读这个 XML 文件并将其转换为 pandas DataFrame:

Parameter<Set>       Parameter<If>
4                     1087
5                     1087
6                     1087
14                    1087
15                    1087
16                    1087
17                    1087
18                    1087

这是我已经尝试过的,但是我遇到了一些错误,并且可能有一种更有效的方法来完成此任务:

import xml.etree.ElementTree as ET
import pandas as pd
import os

def getMetrics(file_name):
    path="C:\\Users\Z003Z9CF\Downloads"
    os.chdir(path)
    tree = ET.parse('sample1.xml')
    print(tree)
    root = tree.getroot()
    print(root.tag)
    result = []
    for setnode in root.iter('Set'):                         
        node = setnode.attrib["Parameter"]  
        for ifnode in setnode:                              
        if "Parameter" in ifnode.attrib:
            result.append(dict(node=node, parameter=ifnode.attrib.get("Parameter")))
                    return result 

df = pd.DataFrame(getMetrics('sample1.xml'), columns["Parameter","Parameter"])          
print(df)

标签: pythonxml

解决方案


首先你调用方法和函数返回是错误的。您定义了只接受一个参数并发送两个参数的函数。根据您xml的还显示输出也是错误的。

输出应根据您的xml

4                     1087
5                     1087
6                     1087
18                    1087

在这里,我在本地设置上调试并纠正了您的功能错误,该设置运行良好。

import xml.etree.ElementTree as ET
import pandas as pd


def getMetrics(file_name):
    tree = ET.parse(file_name)
    root = tree.getroot()
    result = []
    for setnode in root.iter('Set'):
        node = setnode.attrib["Parameter"]
        for ifnode in setnode:
            if "Parameter" in ifnode.attrib:
                result.append(dict(node=node, parameter=ifnode.attrib.get("Parameter")))

    return result


df = pd.DataFrame(getMetrics('sample.xml'))
print(df)

您的xml文件应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Rules>
    <Set Parameter="4" To="90">
         <If Parameter="1087" EqualsTo="90" />
    </Set>
    <Set Parameter="5" To="-5">
         <If Parameter="1087" EqualsTo="87" />
    </Set>
    <Set Parameter="6" To="[-5,23;36,7;58,7;78,8;94,47]">
         <If Parameter="1087" EqualsTo="87" />
     </Set>
     <Set Parameter="14" To="7,5" />
     <Set Parameter="15" To="-7,5" />
     <Set Parameter="16" To="0,5" />
     <Set Parameter="17" To="3" />
     <Set Parameter="18" To="-3" >
         <If Parameter="1087" EqualsTo="87" />
     </Set>
</Rules>

推荐阅读