图书馆目录XML数据也就是MARCXML格式,是图书馆领域用于存储书目信息的标准XML格式,包含了书名、作者、出版社、ISBN、索书号等核心书目字段,结构遵循MARC21标准定义。很多图书馆管理员需要将这类数据导入Excel,方便进行批量修改、筛选特定书目、统计馆藏数量等操作。

MARCXML数据的基本结构
MARCXML的核心结构由<collection>根节点、多个<record>书目记录节点组成,每个记录节点下包含<leader>头字段和多个<datafield>数据字段,每个数据字段通过标签、指示符区分不同书目信息,子字段用<subfield>表示。下面是一个简化的MARCXML示例:
<?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="http://www.loc.gov/MARC21/slim">
<record>
<leader>00000nam a2200000 i 4500</leader>
<datafield tag="245" ind1="1" ind2="0">
<subfield code="a">Python编程入门</subfield>
<subfield code="b">基础教程</subfield>
<datafield tag="100" ind1="1" ind2=" ">
<subfield code="a">张三</subfield>
</datafield>
<datafield tag="020" ind1=" ">
<subfield code="a">9787111111111</subfield>
</datafield>
</record>
</collection>
Excel 2016及以上版本导入方法
新版本Excel内置了XML数据导入功能,操作步骤如下:
- 打开Excel,点击顶部菜单栏的数据选项卡,选择获取数据下的从文件再选择从XML
- 在弹出的文件选择窗口中找到需要导入的MARCXML文件,点击打开
- Excel会自动解析XML结构,弹出导航器窗口,勾选
record节点,点击转换数据进入Power Query编辑器 - 在编辑器中展开
datafield列,根据标签筛选需要的字段,比如245字段对应书名,100字段对应作者,020字段对应ISBN - 点击关闭并上载,数据就会导入到Excel工作表中
Excel旧版本导入方法
如果使用的是Excel 2013及更早版本,没有内置的XML导入适配功能,需要先对MARCXML做预处理,转换为CSV格式再导入:
方法一:使用XSLT转换
编写XSLT样式表将MARCXML映射为CSV格式,下面是适配基础书目字段的XSLT示例:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:marc="http://www.loc.gov/MARC21/slim">
<xsl:output method="text" encoding="UTF-8"/>
<!-- 输出CSV表头 -->
<xsl:template match="/">
书名,作者,ISBN
<xsl:apply-templates select="marc:collection/marc:record"/>
</xsl:template>
<!-- 处理每条记录 -->
<xsl:template match="marc:record">
<xsl:text>
</xsl:text>
<!-- 提取245字段的a子字段作为书名 -->
<xsl:value-of select="marc:datafield[@tag='245']/marc:subfield[@code='a']"/>
<xsl:text>,</xsl:text>
<!-- 提取100字段的a子字段作为作者 -->
<xsl:value-of select="marc:datafield[@tag='100']/marc:subfield[@code='a']"/>
<xsl:text>,</xsl:text>
<!-- 提取020字段的a子字段作为ISBN -->
<xsl:value-of select="marc:datafield[@tag='020']/marc:subfield[@code='a']"/>
</xsl:template>
</xsl:stylesheet>
将上面的代码保存为marc2csv.xsl文件,然后使用支持XSLT转换的工具(比如XMLSpy、在线XSLT转换工具)将MARCXML转换为CSV,再直接用Excel打开CSV文件即可。
方法二:使用Python脚本转换
如果熟悉Python编程,可以用xml.etree.ElementTree库解析MARCXML,提取字段后写入CSV,示例代码如下:
import xml.etree.ElementTree as ET
import csv
# 定义MARCXML的命名空间
namespace = {'marc': 'http://www.loc.gov/MARC21/slim'}
# 解析MARCXML文件
tree = ET.parse('marcxml_data.xml')
root = tree.getroot()
# 打开CSV文件准备写入
with open('marc_output.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
# 写入表头
writer.writerow(['书名', '作者', 'ISBN'])
# 遍历每条record记录
for record in root.findall('marc:record', namespace):
# 提取书名:245字段的a子字段
title_node = record.find("marc:datafield[@tag='245']/marc:subfield[@code='a']", namespace)
title = title_node.text if title_node is not None else ''
# 提取作者:100字段的a子字段
author_node = record.find("marc:datafield[@tag='100']/marc:subfield[@code='a']", namespace)
author = author_node.text if author_node is not None else ''
# 提取ISBN:020字段的a子字段
isbn_node = record.find("marc:datafield[@tag='020']/marc:subfield[@code='a']", namespace)
isbn = isbn_node.text if isbn_node is not None else ''
# 写入一行数据
writer.writerow([title, author, isbn])
运行脚本后生成的CSV文件可以直接用Excel打开,完成数据导入。
导入后的字段整理技巧
导入后的数据可能存在字段合并、特殊字符转义等问题,可以通过以下方式整理:
- 如果书名和副书名在同一个245字段的不同子字段,可以用Excel的合并单元格或者
&连接符拼接,比如=A2&B2将A列书名和B列副书名合并 - 如果导入后出现乱码,检查XML文件的编码格式,确保和Excel打开时的编码一致,通常UTF-8编码兼容性最好
- 对于重复的索书号、ISBN等字段,可以用Excel的删除重复项功能快速去重
常见问题及解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 导入后数据为空 | XML命名空间未匹配,或者字段标签写错 | 检查MARCXML的命名空间定义,确保XSLT或解析代码中命名空间和实际文件一致,核对字段标签是否正确 |
| 中文显示乱码 | 编码不匹配 | 将XML文件保存为UTF-8编码,Excel打开CSV时选择UTF-8编码导入 |
| 字段拆分错误 | 子字段分隔符识别错误 | 预处理时统一子字段分隔规则,或者在Excel中使用分列功能按指定分隔符拆分 |