让我们假设我有一个像这样的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)
答案 0 :(得分:0)
首先,您调用方法和函数返回错误。您定义了仅接受一个参数并发送两个参数的函数。同样根据您的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>