【问题标题】:Zapier Code (JavaStep) Action: How to convert Server XML response body to JSON or JS Object?Zapier Code (JavaStep) Action: 如何将服务器 XML 响应体转换为 JSON 或 JS 对象?
【发布时间】:2020-06-06 07:06:56
【问题描述】:

我正在尝试使用 Zapier Javascript 代码步骤来调用对远程服务器的 HTML 查询。服务器返回一个 XML 响应体,需要进一步解析为 JSON 对象。

首先,我很难找到一种快速的方法来进行这种转换。有一些模块/包可以使用 JQuery 和其他框架,Zapier 不支持这些模块/包(Zapier 引擎支持 NodeJS 8.10.x,没有很多额外的模块/包)。似乎已经为返回 JSON 对象的案例创建了标准文档。

我有以下代码,我也遇到了与此相关的错误:

编辑 (06/05): 根据评论,我将调用代码发布到方法 xml2JSON。


let url = '<https://remote-sever-base-url?method, params etc.>'

let response = await fetch(url);

if (response.ok) { // if HTTP-status is 200-299
    // Response body is in XML format. No JSON available.

    var xmlDoc = await response.text();

    var jsondata = xmlToJson(xmlDoc); 

    console.log(jsonData);

} else {
    alert("HTTP-Error: " + response.status);
}

// Changes XML to JSON
function xmlToJson(xml) {

    // Create the return object
    var obj = {};

    if (xml.nodeType == 1) { // element
        // do attributes
        if (xml.attributes.length > 0) {
        obj["@attributes"] = {};
            for (var j = 0; j < xml.attributes.length; j++) {
                var attribute = xml.attributes.item(j);
                obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
            }
        }
    } else if (xml.nodeType == 3) { // text
        obj = xml.nodeValue;
    }

    // do children
    if (xml.hasChildNodes()) {
        for(var i = 0; i < xml.childNodes.length; i++) {
            var item = xml.childNodes.item(i);
            var nodeName = item.nodeName;
            if (typeof(obj[nodeName]) == "undefined") {
                obj[nodeName] = xmlToJson(item);
            } else {
                if (typeof(obj[nodeName].push) == "undefined") {
                    var old = obj[nodeName];
                    obj[nodeName] = [];
                    obj[nodeName].push(old);
                }
                obj[nodeName].push(xmlToJson(item));
            }
        }
    }
    return obj;
};

错误: The run javascript could not be sent to Code by Zapier. TypeError: xml.hasChildNodes is not a function

仅供参考 - 传入的 XML 在其结构上非常扁平且可预测。

<result>
    <record>
          <field1>
          <field 2>
          ....fields continue
    </record>
    ...... list continues
</result>

因此,DOM 确实有子节点,虽然不是很深的树。 此外,由于这些是关系数据库中的记录,结果集中的所有记录结构都是相似的,尽管在不同的 POST 之间它们会有所不同。希望这可以澄清。

【问题讨论】:

  • 您的代码步骤中还有其他代码吗?你如何调用xmlToJson 函数?您传递给函数的对象是否具有.hasChildNodes 属性?
  • 调用代码基本上是发送一个HTTP请求。这是附加了调用逻辑的代码块。

标签: javascript zapier


【解决方案1】:

当串在一起时,你基本上是在调用(await response.text()).hasChildNodes(),这是一个不存在的函数(因此你的错误)。 response.text() 解析为常规字符串,而不是任何类型的 XML 对象。

我建议不要自己解析它,而是使用“Zapier 的 Webhook”应用程序来发出您的请求 - 它会为您进行 XML 解析并返回一个类似 json 的对象,您可以在下游使用。

【讨论】:

  • 感谢您的建议。一个愚蠢的问题:webhook 不只是用于连接那些发布更改/更新的应用程序吗?在我的场景中,远程服务器不发布更改通知,我需要轮询它(为此,我使用调度程序,然后使用代码步骤)。其次,是否有可能只向这个 xml2js 函数发送原始响应以获得成功?
  • 好问题 - 这个名字有点用词不当。它基本上是“HTTP 请求应用程序”,有很多花里胡哨的东西。例如,它有一个“轮询此端点”触发器,您可以指向任意端点。
  • 对于您的第二个问题,我认为无法使用 vanilla node.js 解析 xml,这就是代码步骤中的全部内容。我会尝试使用 webhook 轮询触发器,但如果这不起作用,您可以创建一个简单的 CLI 集成来处理它。集成可以使用 npm 包,因此您可以使用 XML 解析库。有文档here
  • 谢谢。看看 webhook。那么,在调度程序后跟代码步骤和 webhook 之间,您会推荐哪一个? :-)
  • 绝对是 webhook!当您需要在特定时间/频率发生某些事情时,应保存调度程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
相关资源
最近更新 更多