将孙子 XML 解析为 pandas 数据帧

Parse grandchildren XML to pandas dataframe

提问人:ChemEnger 提问时间:8/31/2023 最后编辑:ChemEnger 更新时间:8/31/2023 访问量:41

问:

我看过各种问题和答案,但没有一个能完全满足我的需求。

我有格式的xml平面文件(由硬件SCADA系统生成)(编辑:之前草率的复制和粘贴,现在用第二个修复,并且有空字段):<row></STATUS>

<?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  

Excel(有一些争吵)给出:Expected Excel Output

目前我正在使用 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水平

pandas DataFrame XML 解析 elementtree

评论

0赞 Jack Fleeting 8/31/2023
首先,您的示例 xml 格式不正确,因此请修复该问题。其次,你能在你的样品中添加另一个吗?最后,您能否从示例 xml 中添加确切的预期输出?row

答:

2赞 Timeless 8/31/2023 #1

除了 extra 和 IIUC,您还可以使用 来访问详细信息</row>POSITION_*

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)

输出:

日期 女士 POSITION_1.价值 POSITION_1.STATUS值 POSITION_1.状态 POSITION_2.价值 POSITION_2.STATUS值 POSITION_2.状态 POSITION_3.价值 POSITION_3.STATUSVALUE POSITION_3.状态
2022-01-14 06:02:36 193 53.985 1327104 + 54.305 1327104 -F- + 54.045 1327104