Zapier如何处理Webhook传来的XML文件

16次阅读

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

Zapier如何处理Webhook传来的XML文件

Webhook收到XML后Zapier默认不解析

Zapier的Webhook触发器(Webhooks by Zapier)接收到http请求时,无论Content-Typeapplication/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或未转义&),ElementTreeParseError: not well-formed;可在Code步骤开头加re.sub(r'[x00-x08x0b-x0cx0e-x1f]', '', xml_string)清洗

XML本身没有“Zapier友好格式”,所有解析都靠手动补足——别指望自动映射,也别跳过清洗和命名空间处理。

text=ZqhQzanResources