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

嵌套XML文件转pandas DataFrame解析问题求助

解决XML解析转pandas DataFrame的问题

嘿,我来帮你搞定这个XML转DataFrame的问题!看你给的示例XML片段,核心是要从<persName>和关联的<placeName>里提取结构化数据对吧?我给你一套直接能用的实现方案,结合Python的XML解析库和pandas来完成。

首先先补全一下你的示例XML结构(方便代码演示):

<root>
  <p>
    <persName id="t17200427-2-defend31" type="defendantName"> Alice Jones 
      <interp inst="t17200427-2-defend31" type="surname" value="Jones"/>
      <interp inst="t17200427-2-defend31" type="given" value="Alice"/>
      <interp inst="t17200427-2-defend31" type="gender" value="female"/>
    </persName> , of 
    <placeName id="t17200427-2-defloc7">St. Michael's Cornhill</placeName>
  </p>
  <!-- 可以有更多类似的被告条目 -->
</root>

接下来是具体的代码实现,我会一步步解释:

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

# 1. 解析XML文件(如果是XML字符串,就用ET.fromstring(xml_str)替代)
tree = ET.parse('your_defendant_file.xml')
root = tree.getroot()

# 2. 准备空列表存储提取的结构化数据
defendant_data = []

# 3. 遍历所有包含被告信息的<p>元素
for paragraph in root.findall('.//p'):
    # 定位当前段落里的<persName>节点
    pers_node = paragraph.find('.//persName')
    if pers_node is not None:
        # 初始化字典存储当前被告的所有信息
        current_defendant = {}
        
        # 提取<persName>自身的属性(可选,按需保留)
        current_defendant['person_id'] = pers_node.get('id')
        current_defendant['person_type'] = pers_node.get('type')
        
        # 遍历子节点<interp>,把type作为key,value作为对应值
        for interp in pers_node.findall('.//interp'):
            interp_type = interp.get('type')
            current_defendant[interp_type] = interp.get('value')
        
        # 提取<persName>里的显示全名,去掉前后多余空格
        current_defendant['full_name'] = pers_node.text.strip()
        
        # 提取关联的<placeName>信息
        place_node = paragraph.find('.//placeName')
        if place_node is not None:
            current_defendant['place_id'] = place_node.get('id')
            current_defendant['location'] = place_node.text.strip()
        
        # 把当前被告的数据加入列表
        defendant_data.append(current_defendant)

# 4. 把列表转成pandas DataFrame
df = pd.DataFrame(defendant_data)
# 查看结果
print(df.head())

代码说明:

  • XPath定位:用.//p和.//persName这种相对路径,可以灵活定位到目标元素,不管XML嵌套层级如何;
  • 属性提取:通过get()方法获取XML元素的属性值,比如id、type;
  • 文本处理:用strip()去掉文本前后的空格,避免数据里出现多余的空白;
  • 扩展性:如果你的XML里还有其他字段(比如年龄、罪名),只需要在遍历的时候添加对应的提取逻辑就行。

运行这段代码后,你会得到一个包含以下列的DataFrame:person_id、person_type、surname、given、gender、full_name、place_id、location,完美对应你示例里的所有信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:34:18