You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多层标签XML转换为含上级节点属性的Pandas DataFrame?

解决XML转DataFrame时获取上级节点属性的问题

你的核心需求是把<pdv>节点的属性(id、latitude、longitude、city)和下属<price>节点的属性合并到同一个DataFrame里,仅用pd.read_xml("myfile.xml", xpath="//price")只能拿到price的数据,因为xpath只定位到了price节点,没关联上级pdv的信息。下面提供两种实用的解决方法:

方法一:手动遍历XML节点(灵活适配复杂结构)

通过xml.etree.ElementTree解析XML,逐个遍历<pdv>和下属的<price>节点,将两者的属性合并后再转成DataFrame:

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

# 解析XML文件
tree = ET.parse("myfile.xml")
root = tree.getroot()

# 存储所有行数据的列表
data_rows = []

# 遍历每个pdv节点
for pdv_node in root.findall(".//pdv"):
    # 提取pdv节点的核心属性
    pdv_info = {
        "id": pdv_node.get("id"),
        "latitude": pdv_node.get("latitude"),
        "longitude": pdv_node.get("longitude"),
        "city": pdv_node.get("city")
    }
    # 遍历当前pdv下的所有price节点
    for price_node in pdv_node.findall(".//price"):
        # 合并pdv属性和price属性,生成一行数据
        row_data = pdv_info.copy()
        row_data.update(price_node.attrib)
        data_rows.append(row_data)

# 转换为DataFrame
df = pd.DataFrame(data_rows)

方法二:用pandas内置的xpath关联父节点属性(简洁高效)

直接通过pd.read_xml的xpath语法,从price节点向上关联父pdv的属性,一次性提取所有需要的字段:

import pandas as pd

df = pd.read_xml(
    "myfile.xml",
    xpath="//price",
    # 若XML存在命名空间,需在这里指定,例如{"ns": "http://your-namespace-url"},同时xpath要改为//ns:price
    namespaces={},
    attrs={
        "pdv_id": "../@id",    # 提取父pdv节点的id属性
        "latitude": "../@latitude",
        "longitude": "../@longitude",
        "city": "../@city",
        "fuel": "@fuel",       # 提取当前price节点的fuel属性
        "value": "@value",
        "date": "@date"        # 根据你的price节点实际属性调整字段
    }
)

注意事项

如果你的XML包含命名空间(例如开头有xmlns="http://xxx.com"),需要在namespaces参数中定义命名空间别名,同时xpath和属性路径要加上别名前缀,比如xpath="//ns:price"、"pdv_id": "../ns:@id"。

内容的提问来源于stack exchange,提问作者MG Fern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:15:31