2012-02-07 11 views
9

ウェブサイトからXMLデータを取り込むFF AddOnを作成しようとしています。しかし、私は自分のレスポンスを解析する方法を見つけることができません。最初に私はDOMParserを使用しますが、私はこのエラーを取得:解析が自動的に行われるので、アドオンSDKを使用してFirefoxアドオンでXML文字列を解析する方法

ReferenceError: DOMParser is not defined.

誰かのXMLHttpRequestを使用することを示唆したが、その後、私は、この他のエラーを取得:

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

私は本当に知りませんの何をすべきか私はこれを達成するために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); 
      } 
     } 
    }); 
}; 

答えて

14

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オブジェクトを使用することを検討してくださいしかし、(xhrモジュールは、現在のリスナーやaddEventListenerの他のタイプをサポートしていません)あなたのリスナーを添付するrequest.onreadystatechangeを使用しています。

+1

+1あなたのユーザーのために、あらゆる種類の同期ネットワークアクセスを避けてください! – canuckistani

+0

@canuckistani: 'xhr'だけが適切な' onload'と 'onevent'プロパティを実装していれば、Web開発者は' onreadystatechange'に慣れているかもしれませんが、私はそれを醜い解決策と考えています。 –

+0

@Wladimir Palant DOMParseソリューションはうまくいきました。しかし、XMLHttpRequestソリューションは私に同じエラーメッセージを投げました。私はあなたがDOMParseで私に勧めたものに似た何かをしてしまいました: 'var {Cc、Ci} = require(" chrome "); var request = Cc ["@ mozilla.org/xmlextras/xmlhttprequest;1"]。createInstance(Ci.nsIXMLHttpRequest); 'それがうまくいった!ありがとう – kriztean

3

XMLHttpRequestxhr 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); 

または何でも。

+0

'responseXML'に' DOMParser'と同様に 'xmlDoc.document.body.innerHTML'を実行できますか? – Noitidart

関連する問題