如何用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值。
正确解决方案
问题根源
- 方法一错把
attrib字典当成函数调用,应该用索引或get方法访问属性。 - 方法二误把属性当成子元素,
xml:id是属性值,本身就是字符串,不需要用.text。 - 方法三大概率是
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
相关产品推荐
相关产品推荐

