【问题标题】:How to parse a XML string in a Firefox addon using Add-on SDK如何使用附加 SDK 解析 Firefox 插件中的 XML 字符串
【发布时间】:2012-02-28 14:31:57
【问题描述】:

我正在尝试创建一个 FF 插件,它可以从网站带来一些 XML 数据。但我找不到解析我的响应的方法。首先我使用了 DOMParser 但我得到了这个错误:

ReferenceError: DOMParser 未定义。

有人建议使用 XMLHttpRequest,因为解析是自动完成的,但是我得到了另一个错误:

错误:发生异常。回溯(最近一次通话最后一次):
文件 “资源://jid0-a23vmnhgidl8wlymvolsst4ca98-at-jetpack/api-utils/lib/cuddlefish.js”, 第 208 行,在要求中 让模块,清单 = this.manifest[base],requirer = this.modules[base];类型错误:this.manifest 未定义

我真的不知道还能做什么。我必须注意,我正在使用 AddOn Builder 来实现这一点。

下面的代码似乎不起作用。

选项 1:

exports.main = function() {

require("widget").Widget({
    id: "widgetID1",
    label: "My Mozilla Widget",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(event) {

    var Request = require("request").Request;
    var goblecontent = Request({
      url: "http://www.myexperiment.org/search.xml?query=goble",
      onComplete: function (response) {
        var parser = new DOMParser(); 
        var xml = parser.parseFromString(response.text, "application/xml");  

        var packs = xml.getElementsByTagName("packs");
        console.log(packs);
      }
    });

    goblecontent.get();

    }
});

};

选项2:

exports.main = function() {
    require("widget").Widget({
        id: "widgetID1",
        label: "My Mozilla Widget",
        contentURL: "http://www.mozilla.org/favicon.ico",
        onClick: function(event) {

            var request = new require("xhr").XMLHttpRequest();
            request.open("GET", "http://www.myexperiment.org/search.xml?query=goble", false);
            request.send(null);  

            if (request.status === 200) {  
              console.log(request.responseText);  
            }  
        }
    });
};

【问题讨论】:

    标签: firefox-addon firefox-addon-sdk domparser


    【解决方案1】:

    DOMParser 构造函数未在 SDK 模块的上下文中定义。但是,您仍然可以使用 chrome authority 获取它:

    var {Cc, Ci} = require("chrome");
    var parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser);
    

    nsIDOMParser documentation.

    也就是说,您使用XMLHttpRequest 的方法也应该有效。您错误地使用了new 运算符,但是您编写它的方式正在创建一个新的“需要对象”。但是,这种方式应该可以工作:

    var {XMLHttpRequest} = require("xhr");
    var request = new XMLHttpRequest();
    

    请考虑使用异步 XMLHttpRequest 对象,但请使用 request.onreadystatechange 附加您的侦听器(xhr 模块目前不支持其他类型的侦听器或 addEventListener)。

    【讨论】:

    • +1 为了您的用户,请避免任何形式的同步网络访问!
    • @canuckistani:现在如果xhr 实现正确的onloadonevent 属性就好了;)Web 开发人员可能习惯于onreadystatechange,但我认为这是一个丑陋的解决方案。
    • @Wladimir Palant。 DOMParse 解决方案效果很好。然而,XMLHttpRequest 解决方案向我抛出了同样的错误消息。我最终做了一些类似于你用 DOMParse 推荐给我的事情:var {Cc, Ci} = require("chrome"); var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);,它奏效了!谢谢
    • @user1042066:请不要这样做。 xhr 模块确保在您的扩展程序被卸载/禁用时自动中止请求 - 常规 XMLHttpRequest 不会做这样的事情。
    • @cprcrack:你说得对,我修复了代码。我认为自从写完答案后情况发生了变化(它是一个内部 API,因此可以随时更改)。
    【解决方案2】:

    如果您使用XMLHttpRequest(可通过xhr module 获得),您可以轻松避免使用DOMParser。下面我提供一个示例,假设 request 是一个 XMLHttpRequest 对象,请求已成功完成:

    代替:

    var parser = new DOMParser(); 
    var xmlDoc = parser.parseFromString(request.responseText, "application/xml");  
    

    用途:

    var xmlDoc = request.responseXML;  
    

    然后你可以:

    var packs = xmlDoc.getElementsByTagName("packs");
    console.log(packs);
    

    或其他。

    【讨论】:

    • responseXML 上你能像DOMParser 那样做xmlDoc.document.body.innerHTML 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2012-02-06
    • 2013-04-15
    • 2012-06-21
    相关资源
    最近更新 更多