webassembly 无法直接解析 xml,需用 rust 等语言编写解析逻辑并编译为 wasm,由 js 传入 xml 字符串或字节,再将结果返回;rust + wasm-pack 是最可行方案,推荐使用 quick-xml 和 wasm-bindgen 实现高效零拷贝交互。
WebAssembly 本身不能直接解析 XML —— 它没有内置的 DOM 或 XML 解析能力,也不访问浏览器的 XMLHttpRequest、DOMParser 或 fetch API。所谓“在 WebAssembly 中解析 XML”,实际是指:用 C/C++/Rust 等语言写解析逻辑,编译为 WASM,再把 XML 字符串(或字节)从 JavaScript 传进去,由 WASM 模块完成结构化解析(如提取标签、属性、文本内容),最后把结果传回 JS。
WASM 模块无法直接读取 File 或 Blob
你上传一个 XML 文件后得到的是 File 或 Blob,WASM 内存是线性、隔离的,不能自动访问浏览器 I/O 对象。必须由 JS 主动读取并转为可传入 WASM 的格式:
- 用
file.text()读成 UTF-8 字符串,再通过TextEncoder.encode()转为Uint8Array - 或用
file.arrayBuffer()直接获取二进制,适用于含非 UTF-8 编码(如 GBK)的 XML(但需额外处理编码转换) - WASM 导出函数通常只接收
pointer(内存偏移)和len(长度),JS 需手动把数据写入 WASM 的memory.buffer
Rust + wasm-pack 是最可行的落地路径
相比 C/C++(需手动管理字符串生命周期、缺乏标准 XML 库集成),Rust 生态有成熟方案:quick-xml 可静态编译进 WASM,wasm-bindgen 支持零拷贝传递字符串和结构体。示例流程: