2012-02-07 13 views
9

Sto provando a creare un AddOn FF che porta alcuni dati XML da un sito web. Ma non riesco a trovare un modo per analizzare la mia risposta. In primo luogo ho usato DOMParser ma ottengo questo errore:Come analizzare una stringa XML in un addon di Firefox usando l'SDK add-on

ReferenceError: DOMParser is not defined.

Qualcuno ha suggerito di utilizzare XMLHttpRequest, perché l'analisi viene effettuata automaticamente, ma poi ottengo questo altro errore:

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

io davvero non so cos'altro fare Devo notare che sto usando AddOn Builder per raggiungere questo obiettivo.

Sotto il codice che non sembra funzionare.

Opzione 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(); 

    } 
}); 

}; 

Opzione 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); 
      } 
     } 
    }); 
}; 

risposta

14

DOMParser costruttore non è definita nel contesto di moduli SDK. È ancora possibile ottenere utilizzando chrome authority però:

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

nsIDOMParser documentation.

Detto questo, il vostro approccio con XMLHttpRequest dovrebbe funzionare così. Tuttavia, hai utilizzato l'operatore new in modo non corretto, nel modo in cui lo hai scritto è stato creato un nuovo "require object". In questo modo dovrebbe funzionare comunque:

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

perche utilizzando un oggetto XMLHttpRequest asincrono tuttavia, utilizzare request.onreadystatechange per collegare il vostro ascoltatore (il modulo xhr attualmente non supporta altri tipi di ascoltatori o addEventListener).

+1

+1 per il bene degli utenti, si prega di evitare l'accesso alla rete sincrono di qualsiasi tipo! – canuckistani

+0

@canuckistani: Ora se solo 'xhr' implementasse le proprietà' onload' e 'onevent' corrette;) Gli sviluppatori web potrebbero essere usati per' onreadystatechange' ma lo considero una brutta soluzione. –

+0

@Wladimir Palant. La soluzione DOMParse ha funzionato alla grande. Tuttavia la soluzione XMLHttpRequest mi ha lanciato lo stesso messaggio di errore.Ho finito per fare qualcosa di simile a ciò che mi hai consigliato con DOMParse: 'var {Cc, Ci} = require (" chrome "); var request = Cc ["@ mozilla.org/xmlextras/xmlhttprequest;1"]. createInstance (Ci.nsIXMLHttpRequest); 'e ha funzionato !. Grazie – kriztean

3

Se si utilizza XMLHttpRequest (disponibile tramite xhr module) è possibile evitare facilmente l'uso di DOMParser. Bellow Fornisco un esempio supponendo request è un oggetto XMLHttpRequest cui richiesta è stata completata con successo:

Invece di:

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

Usa:

var xmlDoc = request.responseXML; 

Una allora si può:

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

O qualsiasi altra cosa.

+0

su 'responseXML' puoi fare' xmlDoc.document.body.innerHTML' come potresti con 'DOMParser'? – Noitidart

Problemi correlati