Zapier的Webhook触发器不自动解析XML,需用Code步骤(Python或JS)处理webhook.body.raw:Python用xml.etree.ElementTree(注意移除XML声明、处理命名空间),JS用xml2js更容错;调试须检查Response Type设为Text、无gzip压缩、XML字符合法。

Webhook收到XML后Zapier默认不解析
Zapier的Webhook触发器(Webhooks by Zapier)接收到HTTP请求时,无论Content-Type是application/xml还是text/xml,它都**原样保留原始请求体为字符串**,不会自动解析成可点选的字段。你看到的body只是一个大文本块,无法直接用{{webhook.body.field_name}}取值。
必须手动用Code步骤解析XML字符串
要在Zapier中提取XML里的数据,必须插入一个Code by Zapier步骤(推荐用Python),把webhook.body.raw传入并解析。注意:webhook.body在旧版Zap中可能为空,务必用webhook.body.raw——这是唯一包含完整XML字符串的字段。
- 选择
Python语言,输入变量名如xml_string - 用
xml.etree.ElementTree解析(标准库,无需安装) - 处理常见陷阱:XML声明
可能导致ParseError,建议先用.replace()移除或用xmltodict(需切换到JS Code) - 若XML含命名空间(如
),find()必须传namespaces参数,否则返回None
import xml.etree.ElementTree as ET去掉XML声明(可选,避免解析失败)
clean_xml = input_data['xml_string'].replace('', '').strip()
try: root = ET.fromstring(clean_xml)
提取
123 order_id = root.find('order_id') output = {'order_id': order_id.text if order_id is not None else ''}except Exception as e: output = {'error': str(e)}
替代方案:用JS Code + xml2js(更容错)
如果XML结构复杂、有嵌套或命名空间,Python的
ElementTree容易出错。此时改用Code by Zapier (JavaScript),配合xml2js库(Zapier内置支持)更稳妥:
-
xml2js.parseString()能自动处理声明、空格、命名空间前缀 - 结果是JS对象,可直接用
response.order.order_id[0]访问(数组形式因重复标签) - 注意:返回的是嵌套对象,不是扁平字段,需在后续步骤用
output.order.order_id[0]引用
const xml2js = require('xml2js');
const parser = new xml2js.Parser({ explicitArray: false });
parser.parseString(input_data.xml_string, (err, result) => {
if (err) {
output = { error: err.message };
} else {
output = result;
}
});
调试时重点检查这三处
XML Webhook在Zapier中最常卡在这几个环节,不是逻辑问题而是环境细节:
- Webhook触发器的
Response Type设成了JSON——这会导致Zapier尝试JSON解析原始XML,直接报错;必须改成Text - 发送方用了gzip压缩但没配
Content-Encoding: gzip头,Zapier无法解压,body.raw会是乱码 - XML含非法字符(如控制字符
\x00或未转义&),ElementTree抛ParseError: not well-formed;可在Code步骤开头加re.sub(r'[\x00-\x08\x0b-\x0c\x0e-\x1f]', '', xml_string)清洗
XML本身没有“Zapier友好格式”,所有解析都靠手动补足——别指望自动映射,也别跳过清洗和命名空间处理。










