Word 文档在内容编排上足够灵活,但当需要把文档内容送入下游系统做结构化处理时,XML 往往是更合适的中转格式。无论是构建文档内容索引、做数据抽取,还是与旧版系统对接,将 .docx 转换为 XML 都是一项基础操作。Python 生态中能处理 Word 的库不少,但专门为格式转换设计的选项相对有限。本文围绕 Spire.Doc for Python,梳理 Word 转 XML 的代码实现、批量处理中的资源管理,以及转换时需要注意的几个实际问题。
环境准备
Spire.Doc for Python 是一个独立的 Word 文档处理库,转换过程不依赖 Microsoft Word 或 Office 组件。安装通过 pip 完成:
bash
pip install Spire.Doc
导入时需要注意,Document 类与 FileFormat 枚举分别位于不同的模块:
python
from spire.doc import *
from spire.doc.common import *
FileFormat 是指定输出格式的关键,它决定了 SaveToFile 方法最终生成的文件类型。
基础转换:单文件输出
单文件转换的代码量很小,核心只有三步:加载、保存、释放。
python
from spire.doc import *
from spire.doc.common import *
document = Document()
document.LoadFromFile("sample.docx")
document.SaveToFile("output.xml", FileFormat.Xml)
document.Close()
这段代码的行为很直接:LoadFromFile 读取磁盘上的 Word 文件,SaveToFile 将其序列化为 XML 格式。生成的 .xml 文件可以用任何文本编辑器查看,适合作为数据管道中的中间产物。对于只需要提取文字内容与基本段落结构的场景,这种方式足够简洁。
输出格式的选择
实际使用中容易混淆的是与 XML 相关的几个格式枚举。它们都产出 XML 结构,但语义层次不同:
| 格式枚举 | 输出扩展名 | 典型用途 |
|---|---|---|
FileFormat.Xml |
.xml |
通用结构化数据 |
FileFormat.WordXml |
.wordxml |
保留 Word 排版语义 |
FileFormat.WordML |
.wordml |
Word 2003 格式兼容 |
FileFormat.Xml 输出的是较为扁平的通用 XML,适合下游只做通用解析的场景。FileFormat.WordXml 对应 Word 2007 及之后版本使用的 WordprocessingML,内部结构遵循 Office Open XML 规范,保留了段落样式、字体信息、表格结构等 Word 特有语义,适合需要回写 Word 或做精细排版分析的情况。FileFormat.WordML 则是 Word 2003 使用的旧版 XML 格式,主要用于与遗留系统对接。
选择哪一种,取决于下游系统需要什么。如果对方只是一个通用的 XML 解析器,FileFormat.Xml 的输出最直接;如果下游需要理解"这是标题""这是表格"这类 Word 语义,则应该选择 WordXml。这一项属于转换前需要先确认的实践要点。
批量处理与资源管理
单文件转换的代码量很小,但实际工作中往往需要处理成批的文档。在循环中反复创建 Document 对象时,资源释放需要留意。Document 对象持有文件句柄和内部资源,如果只依赖 Python 的垃圾回收,在处理大量文件时可能出现内存持续增长的情况。
一个稳妥的做法是在每次转换后显式调用 Close(),并在循环中适当触发回收:
python
import os
import gc
from spire.doc import *
from spire.doc.common import *
input_dir = "./docs"
output_dir = "./xml_output"
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.endswith((".doc", ".docx")):
doc = Document()
try:
doc.LoadFromFile(os.path.join(input_dir, filename))
out_name = os.path.splitext(filename)[0] + ".xml"
doc.SaveToFile(os.path.join(output_dir, out_name), FileFormat.Xml)
finally:
doc.Close()
del doc
gc.collect()
这段代码的要点在于 try...finally 结构:无论加载或保存是否成功,Close() 都会被调用。del doc 配合 gc.collect() 进一步帮助释放底层资源。对于几十个文件的批量任务,这样做与不做之间的内存差异可能并不明显;但当文件数量上升到数百甚至上千时,显式管理资源就是必要的了。
转换中的其他注意事项
格式保真度的边界。 将 Word 转为 XML 时,并非所有 Word 特性都能无损映射。复杂排版如文本框嵌套、艺术字、某些域代码,在 XML 输出中可能以简化或变形的方式呈现。如果转换结果要用于严格的文档重建,建议先用包含代表性元素的文档做测试,确认关键排版信息是否保留。
免费版本的功能限制。 根据官方说明,免费版本在读取或写入 Word 文件时存在段落数(500 段)和表格数(25 个)的限制。这一限制作用于文档的加载与保存环节,因此 Word 转 XML 的输出完整性同样会受到影响。如果处理的文档段落或表格数量接近或超过上述阈值,输出结果可能不完整。建议在实际使用前用具有代表性的文档验证输出范围。
编码与命名空间。 生成的 XML 文件默认采用 UTF-8 编码,但 WordXml 格式的输出会包含 Office 命名空间声明。如果下游解析器对命名空间敏感,需要在解析时做相应处理。对于普通 XML 输出(FileFormat.Xml),结构相对扁平,命名空间负担较小。
小结
Word 转 XML 在代码层面并不复杂,LoadFromFile 与 SaveToFile 两次调用即可完成基本转换。但能够完成转换与输出结果可直接使用之间仍存在差距,输出格式决定了 XML 的语义层次,资源释放影响批量任务的稳定性,而保真度、版本限制与编码细节则关系到转换结果能否顺利进入下游流程。这些问题单独来看并不复杂,却往往在转换任务从示例代码转向实际应用时才会显现。建议先以规模适中、具有代表性的文档进行验证,再扩展至正式流程,通常比事后排查输出异常更为高效。