express 无内置 json 转 xml 功能,需用 js2xmlparser 等第三方库;它轻量、支持嵌套与数组,但跳过 null/undefined,不自动支持 cdata 或命名空间,需手动设 content-type 和根标签名。

Express 中没有内置 JSON 转 XML 功能
Node.js 和 Express 本身不提供 json2xml 或类似转换能力。你需要引入第三方库,最常用的是 js2xmlparser(轻量、无依赖、支持嵌套和数组),其次可选 xmlbuilder2 或 xml2js(后者更常用于反向解析)。fast-xml-parser 也支持序列化,但默认倾向严格校验,对简单转换略重。
用 js2xmlparser 实现简洁转换
它把 JS 对象直接映射为 XML 树,不强制 schema,适合 API 响应这类场景。注意:它不会自动处理 null 或 undefined 字段(默认跳过),也不支持 CDATA 或命名空间,除非显式配置。
- 安装:
npm install js2xmlparser - 在路由中使用前需
const js2xmlparser = require("js2xmlparser") - 返回时必须设置
Content-Type: application/xml,否则前端可能解析失败 - 顶层标签名需手动指定,比如
js2xmlparser("response", data)→<response>...</response>
app.get("/api/data.xml", (req, res) => {
const jsonData = {
user: {
id: 123,
name: "Alice",
tags: ["admin", "active"]
}
};
res.set("Content-Type", "application/xml");
res.send(js2xmlparser("data", jsonData));
});
处理数组和特殊字符的常见坑
js2xmlparser 默认把数组元素转成同名重复标签(如 tags → 多个 <tags>admin</tags>),这符合 XML 惯例;但如果后端期望单标签内逗号分隔,就得先预处理数组。另外,值中含 &、、<code>> 会被自动转义,无需额外 escape —— 这是优点,但若你误用 xmlbuilder2 的 ele().text() 链式写法又忘了转义,就可能产出非法 XML。
- 数组输出不可控?改用对象包装:
tags: { tag: ["admin", "active"] }→ 更清晰的嵌套结构 - 需要根节点带属性(如
<data version="1.0"></data>)?传入第三个参数:js2xmlparser("data", jsonData, { declaration: { encoding: "UTF-8" }, attributes: { version: "1.0" } }) - 遇到
TypeError: Cannot convert undefined or null to object?检查输入是否为null或undefined,加一层jsonData ?? {}
不推荐在 Express 中动态拼接 XML 字符串
有人会想用模板字符串或 JSON.stringify + 正则替换,例如 `<user><id>${obj.id}</id>`</user>。这种写法极易出错:obj.name 含 & 就导致 XML 解析失败;没处理嵌套对象会漏字段;也没有缩进或编码声明。一旦数据结构变化,维护成本远高于引入一个稳定小库。
真正需要定制化 XML(比如带注释、处理二进制 base64、兼容老旧系统要求的 DTD)才考虑 xmlbuilder2;日常 REST API 的 JSON-to-XML 适配,js2xmlparser 足够稳,且它的输出默认不带换行缩进——这点反而利于减少响应体积,不必额外 .replace(/\s+/g, " ")。









