2012-02-07 14 views
9

Estoy intentando crear un complemento FF que aporte algunos datos XML de un sitio web. Pero no puedo encontrar una forma de analizar mi RESPUESTA. En primer lugar he usado DOMParser pero me sale este error:Cómo analizar una cadena XML en un complemento de Firefox usando Add-on SDK

ReferenceError: DOMParser is not defined.

Alguien sugirió usar XMLHttpRequest, debido a que el análisis se realiza de forma automática, pero luego me sale este otro error:

Error: An exception occurred. Traceback (most recent call last):
File "resource://jid0-a23vmnhgidl8wlymvolsst4ca98-at-jetpack/api-utils/lib/cuddlefish.js", line 208, in require let module, manifest = this.manifest[base], requirer = this.modules[base]; TypeError: this.manifest is undefined

Realmente no sé qué otra cosa hacer. Debo señalar que estoy usando AddOn Builder para lograr esto.

Debajo del código que parece que no funciona.

Opción 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(); 

    } 
}); 

}; 

Opción 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); 
      } 
     } 
    }); 
}; 

Respuesta

14

DOMParser constructor no se define en el contexto de módulos SDK. Todavía se puede conseguir usando chrome authority sin embargo:

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

nsIDOMParser documentation.

Dicho esto, su enfoque con XMLHttpRequest debería funcionar también. Usó el operador new incorrectamente, sin embargo, se está creando la forma en que lo escribió un nuevo "objeto requerido". Esta forma en que debe trabajar sin embargo:

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

Por favor, considere el uso de un objeto XMLHttpRequest asíncrono sin embargo, utilizar request.onreadystatechange adjuntar a su oyente (el módulo xhr actualmente no es compatible con otros tipos de oyentes o addEventListener).

+1

+1 por el bien de sus usuarios, evite el acceso sincrónico a la red de cualquier tipo. – canuckistani

+0

@canuckistani: Ahora si solo 'xhr' implementara las propiedades' onload' y 'onevent' adecuadas;) Los desarrolladores web podrían ser utilizados para' onreadystatechange', pero considero que es una solución desagradable. –

+0

@Wladimir Palant. La solución DOMParse funcionó muy bien. Sin embargo, la solución XMLHttpRequest me arrojó el mismo mensaje de error.Terminé haciendo algo similar a lo que me recomendó con DOMParse: 'var {Cc, Ci} = require (" chrome "); var request = Cc ["@ mozilla.org/xmlextras/xmlhttprequest;1"]. createInstance (Ci.nsIXMLHttpRequest); '¡y funcionó !. Gracias – kriztean

3

Si usa XMLHttpRequest (disponible a través del xhr module) puede evitar fácilmente el uso de DOMParser. Abajo proporciono un ejemplo suponiendo request es un objeto XMLHttpRequest cuales solicitud se completó con éxito:

En lugar de:

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

Uso:

var xmlDoc = request.responseXML; 

Un continuación, se puede:

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

O lo que sea.

+0

en 'responseXML' ¿puedes hacer' xmlDoc.document.body.innerHTML' como lo hiciste con 'DOMParser'? – Noitidart

Cuestiones relacionadas