Python 将 Word 文档转换为 XML 的实践要点

28 阅读5分钟

Word 文档在内容编排上足够灵活,但当需要把文档内容送入下游系统做结构化处理时,XML 往往是更合适的中转格式。无论是构建文档内容索引、做数据抽取,还是与旧版系统对接,将 .docx 转换为 XML 都是一项基础操作。Python 生态中能处理 Word 的库不少,但专门为格式转换设计的选项相对有限。本文围绕 Spire.Doc for Python,梳理 Word 转 XML 的代码实现、批量处理中的资源管理,以及转换时需要注意的几个实际问题。

环境准备

Spire.Doc for Python 是一个独立的 Word 文档处理库,转换过程不依赖 Microsoft Word 或 Office 组件。安装通过 pip 完成:

pip install Spire.Doc

导入时需要注意,Document 类与 FileFormat 枚举分别位于不同的模块:

from spire.doc import *
from spire.doc.common import *

FileFormat 是指定输出格式的关键,它决定了 SaveToFile 方法最终生成的文件类型。

基础转换:单文件输出

单文件转换的代码量很小,核心只有三步:加载、保存、释放。

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.wordmlWord 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(),并在循环中适当触发回收:

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 的语义层次,资源释放影响批量任务的稳定性,而保真度、版本限制与编码细节则关系到转换结果能否顺利进入下游流程。这些问题单独来看并不复杂,却往往在转换任务从示例代码转向实际应用时才会显现。建议先以规模适中、具有代表性的文档进行验证,再扩展至正式流程,通常比事后排查输出异常更为高效。