Zapier原生不支持XML解析,需用Code by Zapier配合fast-xml-parser手动解析为JS对象,或通过Webhook调用外部服务转JSON;发送XML时须设Content-Type、确保UTF-8编码及格式规范。
Zapier 的核心数据处理模型基于 JSON,所有触发器、动作和路径(Path)都默认以 JSON 格式流转。当你从一个返回 application/xml 的 API 接口(比如老系统、SOAP 服务或某些政府公开接口)获取响应时,Zapier 不会自动把它转成可点选的字段——你看到的只是原始字符串,xml 内容被当作黑盒文本塞进 raw_response 或类似字段里。
这是最常用、也最可控的方式。Zapier 的 Code by Zapier 步骤支持 Node.js(v18),你可以用轻量库如 fast-xml-parser 解析 XML 字符串为 JS 对象。注意:不能用 DOMParser(无浏览器环境),也不能用 xml2js(含 C++ 依赖,Zapier 不支持)。
Code by Zapier 中选择 Run JavaScript
inputData.xml)parse 会抛
const { XMLParser } = require('fast-xml-parser');
// 输入必须是字符串,例如 inputData.xml = '- A
'
const parser = new XMLParser({
ignoreAttributes: false,
attributeNamePrefix: '@_',
ignoreDeclaration: true,
});
const result = parser.parse(inputData.xml);
output = { parsed: result };
解析后,你就能在后续步骤中通过 {{steps.code.parsed.root.item.@_id}} 这类路径引用属性,或 {{steps.code.parsed.root.item}} 引用文本内容。
如果 XML 结构复杂、含命名空间、CDATA 或 DTD,fast-xml-parser 可能报错或丢失信息。这时更稳的做法是把 XML 转发给一个可控的中间服务,由它完成解析并返回 JSON。
Webhook by Zapier 的 POST 动作,把原始 XML 发到你自己的轻量 endpoint(比如 Cloudflare Workers、Vercel Edge Function 或简单 Flask API)text/xml,用成熟 XML 库(如 Python 的 xml.etree.ElementTree 或 lxml)解析,再 jsonify 后返回这种方案牺牲一点延迟,但避免了 Zapier 环境下 XML 特性支持不全的问题,尤其适合带命名空间(xmlns)或混合文本/子元素的 XML。
当 Zapier 作为发起方要 POST XML(比如对接某 ERP 的 REST API),关键不是“怎么生成 XML”,而是“怎么让请求被正确识别”:
Content-Type: application/xml(在 Webhook 步骤的 Headers 里填)`${inputData.id} `
trim() 处理生成的字符串更稳妥XML 的灵活性恰恰是它在 Zapier 里难搞的原因:没有 schema 就无法自省结构,没有运行时 DOM 就没法像浏览器那样查节点。实际用下来,90% 的 XML 集成问题,根子不在语法,而在没确认清楚对方接口到底期望什么格式、什么编码、什么命名空间——这些细节漏掉,光调通解析也没用。