2012-02-07 9 views
9

Próbuję utworzyć dodatek FF, który przynosi niektóre dane XML ze strony internetowej. Ale nie mogę znaleźć sposobu na przeanalizowanie mojego ODPOWIEDZI. Pierwszy użyłem DOMParser ale otrzymuję ten błąd:Jak analizować łańcuch XML w dodatku Firefox przy użyciu dodatku SDK

ReferenceError: DOMParser is not defined.

Ktoś zasugerował, aby użyć XMLHttpRequest, gdyż parsowanie jest wykonywane automatycznie, ale potem się ten drugi błąd:

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

ja naprawdę nie wiem co jeszcze zrobić. Muszę zauważyć, że używam narzędzia AddOn Builder, aby to osiągnąć.

Poniżej kodu, który wydaje się nie działać.

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

    } 
}); 

}; 

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

Odpowiedz

14

DOMParser konstruktor nie jest zdefiniowane w ramach modułów SDK. Nadal można dostać go za pomocą chrome authority jednakże:

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

nsIDOMParser documentation.

To powiedziawszy, twoje podejście z XMLHttpRequest również powinno działać. Niepoprawnie użyłeś operatora new, ale w ten sposób tworzony jest nowy "obiekt wymagający". W ten sposób powinno działać jednak:

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

Proszę rozważyć użycie asynchronicznego XMLHttpRequest obiekt jednak użyć request.onreadystatechange dołączyć swoją słuchacza (moduł xhr obecnie nie obsługuje inne rodzaje słuchaczy lub addEventListener).

+1

+1 ze względu na użytkowników, należy unikać synchronicznego dostępu do sieci jakiegokolwiek rodzaju! – canuckistani

+0

@canuckistani: Teraz, jeśli tylko 'xhr' zaimplementował odpowiednie właściwości' onload' i 'onevent';) Twórcy stron WWW mogą być wykorzystani do' onreadystatechange', ale uważam to za brzydkie rozwiązanie. –

+0

@Wladimir Palant. Rozwiązanie DOMParse działało świetnie. Jednak rozwiązanie XMLHttpRequest rzuciło na mnie ten sam komunikat o błędzie.W efekcie zrobiłem coś podobnego do tego, co poleciłeś mi z DOMParse: 'var {Cc, Ci} = require (" chrome "); var request = Cc ["@ mozilla.org/xmlextras/xmlhttprequest;1"]. createInstance (Ci.nsIXMLHttpRequest); 'i zadziałało !. Dziękuję – kriztean

3

Jeśli używasz XMLHttpRequest (dostępnego przez), możesz łatwo uniknąć korzystania z DOMParser. Bellow mi podać przykład przy założeniu, request jest XMLHttpRequest obiektem, którego wniosek zostanie pomyślnie zakończona:

Zamiast:

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

Zastosowanie:

var xmlDoc = request.responseXML; 

następnie można:

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

Cokolwiek.

+0

na 'responseXML' można zrobić' xmlDoc.document.body.innerHTML' jak można z 'DOMParser'? – Noitidart

Powiązane problemy