我看过各种问题和答案,但没有一个完全满足我的需求。
我有 xml 平面文件(由硬件 SCADA 系统生成),格式如下(编辑:之前草率复制和粘贴,现在用第二个修复并且有空字段):
<?xml version='1.0' encoding='UTF-8'?>
<doc>
<row>
<DATE>2022-01-14 06:04:18</DATE>
<MS>9</MS>
<POSITION_1>
<VALUE>53.9850 </VALUE>
<STATUSVALUE>1327104</STATUSVALUE>
<STATUS> +</STATUS>
</POSITION_1>
<POSITION_2>
<VALUE>54.3050 </VALUE>
<STATUSVALUE>1327104</STATUSVALUE>
<STATUS>-F- +</STATUS>
</POSITION_2>
<POSITION_3>
<VALUE>54.0450 </VALUE>
<STATUSVALUE>1327104</STATUSVALUE>
</STATUS>
</POSITION_3>
</row>
<row>
<DATE>2022-01-14 06:04:42</DATE>
<MS>302</MS>
<POSITION_1>
<VALUE>54.2600 </VALUE>
<STATUSVALUE>1327104</STATUSVALUE>
<STATUS> +</STATUS>
</POSITION_1>
<POSITION_2>
<VALUE>54.4350 </VALUE>
<STATUSVALUE>1327104</STATUSVALUE>
<STATUS> +</STATUS>
</POSITION_2>
<POSITION_3>
<VALUE>54.0800 </VALUE>
<STATUSVALUE>1327104</STATUSVALUE>
<STATUS> +</STATUS>
</POSITION_3>
</row>
</doc>
(实际上是 POSITION_6)并且希望返回一个与我使用 Power Query 执行导入并最终得到列时 Excel 创建的格式相同的数据框:
DATE
MS
POSITION_1.VALUE
POSITION_1.STATUSVALUE
POSITION_1.STATUS
POSITION_2.VALUE
POSITION_2.STATUSVALUE
POSITION_2.STATUS
POSITION_3.VALUE
POSITION_3.STATUSVALUE
POSITION_3.STATUS
目前我正在使用 Pandas read_xml,我刚刚得到:
DATE MS POSITION_1 ... POSITION_4 POSITION_5 POSITION_6
0 2022-01-14 06:02:36 193 NaN ... NaN NaN NaN
1 2022-01-14 06:04:18 9 NaN ... NaN NaN NaN
2 2022-01-14 06:04:42 302 NaN ... NaN NaN NaN
3 2022-01-14 06:05:15 582 NaN ... NaN NaN NaN
4 2022-01-14 06:05:46 579 NaN ... NaN NaN NaN
因为它的读数不低于树中的 POSITION_X 级别
除了额外的
</row>
和 IIUC 之外,你还可以使用 elementtree 来达到 POSITION_*
details :
import xml.etree.ElementTree as ET
data = [
dict(
{fld: row.findtext(fld) for fld in ["DATE", "MS"]},
**{f"{p.tag}.{details.tag}": details.text for p in row for details in p}
)
for row in ET.parse("file.xml").findall("row") # <- put here the actual filepath
]
df = pd.DataFrame(data)
输出:
日期 | MS | POSITION_1.VALUE | POSITION_1.STATUSVALUE | POSITION_1.状态 | POSITION_2.VALUE | POSITION_2.STATUSVALUE | POSITION_2.状态 | POSITION_3.VALUE | POSITION_3.STATUSVALUE | POSITION_3.状态 |
---|---|---|---|---|---|---|---|---|---|---|
2022-01-14 06:02:36 | 193 | 53.985 | 1327104 | + | 54.305 | 1327104 | -F-+ | 54.045 | 1327104 |