【问题标题】:Working with XML in a Firefox Add-on(ex Jetpack)在 Firefox 附加组件中使用 XML(例如 Jetpack)
【发布时间】:2011-06-28 15:47:36
【问题描述】:

我目前正在开发一个 Firefox 插件(使用 https://addons.mozilla.org/en-US/developers/docs/sdk/1.0/ ),它使用返回数据在 xml 中的 API。

我的问题是我需要解析返回的数据,并且想使用 xml 对象来完成。

由于请求模块仅支持 JSON 和文本 (https://addons.mozilla.org/en-US/developers/docs/sdk/1.0/packages/addon-kit/docs/request.html#Response),我需要将 response.text 转换为 XML。 代码如下所示:

var Request = require('request').Request  
.......
var req = Request({
        url: https://to-the-api.com,
        content: {
          op: 'get-the-data-op',
          password: "super-sec",
          user: "username"
        },
        onComplete: function (response) {

         dataAsText = response.text;
         console.log("output: " + dataAsText);
        }
    });
    req.post();

我曾尝试使用 (new DOMParser).parseFromString(response.text, 'text/xml') 但不幸的是它只是失败并出现类似 ReferenceError: DOMParser is not defined

问题是你们中是否有人能够在 Firefox 插件中创建 Xml 对象,如果可以,如何?

【问题讨论】:

标签: firefox-addon firefox-5


【解决方案1】:

看起来像 xml 解析响应的能力存在,但已被删除。 check out this bugzilla reference

【讨论】:

    【解决方案2】:

    如果您想将响应作为 XML 处理,您不能使用普通的 XMLHttpRequest 吗?

    【讨论】:

    • 是的,我为什么没想到...非常感谢。与Requestobject 相比,XMLHttpRequest surly 有一些限制,但我确实认为这个解决方案对我有用......
    【解决方案3】:

    如果DOMParser不可用,你可以试试E4X

    var xml = new XML(response.text);
    alert(xml.children().length());
    

    【讨论】:

    • 很遗憾,我忘了说我尝试过新的 XML 但没有运气。像:x = new XML('<el><unread_count><count>0</count></unread_count><notification><id>123</id><type>0</type><post>456</post></notification></el>'); console.log(x) 这样的代码最终会出现错误,例如:error: An exception occurred. Traceback (most recent call last): TypeError: can't wrap XML objects
    【解决方案4】:

    您想使用XMLHttpRequest 对象来处理您的xhr 请求。然后,当您收到回复时,访问request 变量的responseXML 对象。在responseXML 中,您将拥有documentElement,并且可以使用querySelectorAllquerySelector 来查找您想要的元素。在您想要的每个元素中,只需获取您需要的 textContent

    这是一个让你开始的例子(这会在响应中查找“xmls”元素):

    var request = new require("xhr").XMLHttpRequest();
    request.open('GET', 'https://to-the-api.com', true);
    request.onreadystatechange = function (aEvt) {
      if (request.readyState == 4) {
         if(request.status == 200) {
          var xmls = request.responseXML.documentElement.querySelectorAll("xmls");
          for (var i = 0; i < xmls.length; i++) {
            console.log("xml", i, xmls[i], xmls[i].textContent);
          }
         }
         else {
           console.log('Error', request.responseText);
         }
      }
    };
    request.send(null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多