文档解析¶
机体当前的全部文档解析逻辑已经迁移至 thirdparty/doc2md 目录下的 doc2md 库,知识库上传流程直接调用 doc2md::convertFile(path) 将任意输入转换为统一的 Markdown 文本,然后再进入分块与嵌入流程。doc2md 采用纯 C++11 实现,核心依赖 miniz(ZIP 容器解压)、tinyxml2(OpenXML/ODF XML 解析)与 libxls(WPS/BIFF 表格读取),在 Qt 生态内跨平台工作。
- 文本 / Markdown / 代码 / HTML
.txt/.log/.json/.ini/.cfg等直接读取 UTF-8 文本并裁剪空白。.md/.markdown通过markdownToText去除标题、链接、代码块等装饰,保证知识库纯文本分块的一致性。-
.cpp/.py/.js/.ts/.css/.html/.htm等代码与网页文件会自动包裹为language ...代码块或执行htmlToText,保留语义结构。 -
Office / OpenXML 模式
.docx/.pptx/.xlsx使用miniz内存解压word/document.xml、ppt/slides/slide*.xml、xl/sharedStrings.xml等内容,再由tinyxml2解析节点,输出带有## Heading、- bullet、Markdown 表格等结构化文本。-
.odt/.odp/.ods同样依赖tinyxml2解析 ODF XML,保留段落/列表/表格结构。 -
WPS / 旧格式
.doc/.wps通过 doc2md 内置的 Compound Binary 流阅读器解析 piece-table,自动处理 Unicode 与多种代码页。.et优先调用libxls解析所有 sheet 并生成## Sheet N+ Markdown 表格;失败时再回退到 UTF-16 扫描。-
.dps解析 PowerPoint 二进制记录(TextChars/TextBytes/CString),与.pptx保持一致的 Markdown 输出。 -
知识库集成
Expend::preprocessFiles会逐个文件调用 doc2md 并收集result.warnings,在 UI 日志中输出[doc2md] ...,解析失败则直接跳过该文件。- 获取到的 Markdown 文本继承原始标题、段落、表格与代码块,再经过
tokenizeContent滑动窗口切分、交叠合并,写入“待嵌入”表格。 -
通过统一的 Markdown,后续相似度计算与 SQLite 持久化不再区分格式,减少旧版 docparser 的多分支维护成本。
-
测试与回归保障
- 单测位于
tests/unit/docs/doc2md_tests.cpp,使用真实的.doc/.wps/.et/.dps样例与临时docx夹测试doc2md::convertFile输出,覆盖主流格式。 - doc2md 库本身也保留
thirdparty/doc2md/tests(默认关闭),如需深入排查可单独构建。
得益于 doc2md 的统一接口,知识库上传流程现在可以天然支持上述全部格式,并且当 doc2md 添加新的解析器(如 ODT/ODP/ODS)时,EVA 前端无需再额外扩展分支即可自动继承能力。