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

如何用Python的ElementTree提取XML的xml:id值到DataFrame

提取TEI XML中biblStruct的xml:id并写入Pandas DataFrame

我正在把XML格式的书目信息转换成可用格式,最后一步是提取biblStruct元素的xml:id属性值并添加到Pandas DataFrame里,已经用ElementTree和Pandas完成了其他操作。

需要提取的示例XML结构:

<biblStruct type="book" xml:id="Kagawa2014" corresp="http://zotero.org/users/local/fmahZILk/items/EAK64XAU">
    <monogr>
<!-- 省略内部内容 -->
    </monogr>
</biblStruct>

目标是提取其中的Kagawa2014。

尝试过的方法及问题

方法一

for biblStruct in root.findall('.//tei:biblStruct', namespace):
    id_elem = biblStruct.attrib('xml:id')

报错:TypeError: 'dict' object is not callable

方法二

xmlID = []
for biblStruct in root.findall('.//tei:biblStruct', namespace):
    id_elem = biblStruct.get('{http://w3.org/XML/1998/namespace}id')
    id_text = id_elem.text if id_elem is not None else ''
    xmlID.append(id_text)

data = {
    'XML_ID':xmlID
}
df = pd.DataFrame(data)
print(df)

问题:返回的DataFrame只显示行号(0,1,2...),没有正确的xml:id值。

方法三

xmlID = []
for biblStruct in root.findall('.//tei:biblStruct', namespace):
    id_elem = biblStruct.get('{http://w3.org/XML/1998/namespace}id')
    xmlID.append(id_elem)

data_again = {
    'XML_ID': xmlID
}
df_again = pd.DataFrame(data_again)
print(df_again)

问题:DataFrame行数翻倍,且未获取到正确的xml:id值。

正确解决方案

问题根源

  1. 方法一错把attrib字典当成函数调用,应该用索引或get方法访问属性。
  2. 方法二误把属性当成子元素,xml:id是属性值,本身就是字符串,不需要用.text。
  3. 方法三大概率是xmlID列表被重复初始化或循环重复执行,导致行数翻倍。

可行代码

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

# 假设已完成XML解析,root为根元素,namespace是命名空间字典(比如{'tei': 'http://www.tei-c.org/ns/1.0'})
xmlID = []

for biblStruct in root.findall('.//tei:biblStruct', namespace):
    # 两种获取xml:id的方式二选一:
    # 方式1:使用完整命名空间URI(更规范)
    xml_id = biblStruct.get('{http://www.w3.org/XML/1998/namespace}id')
    # 方式2:直接用属性名(部分场景下解析器会保留前缀)
    # xml_id = biblStruct.attrib.get('xml:id')
    
    # 处理空值,避免DataFrame出现None
    xmlID.append(xml_id if xml_id is not None else '')

# 生成DataFrame
df = pd.DataFrame({'XML_ID': xmlID})
print(df)

注意事项

  • xml:id属于XML标准命名空间,URI固定为http://www.w3.org/XML/1998/namespace,用get方法时带完整URI更稳妥。
  • 属性值直接是字符串,不要去访问.text,.text是给子元素的文本内容用的。
  • 确保xmlID列表只初始化一次,放在循环外面,避免重复添加数据导致行数异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:51:19