2012-02-07 24 views
9

Tôi đang cố gắng tạo một FF AddOn để mang một số dữ liệu XML từ một trang web. Nhưng tôi không thể tìm cách phân tích RESPONSE của tôi. Trước tiên tôi sử dụng DOMParser nhưng tôi nhận được lỗi này:Cách phân tích cú pháp chuỗi XML trong Firefox addon bằng cách sử dụng Add-on SDK

ReferenceError: DOMParser is not defined.

Có người đề nghị sử dụng XMLHttpRequest, bởi vì các phân tích được thực hiện tự động nhưng sau đó tôi nhận được lỗi khác này:

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

Tôi thực sự không biết còn cần phải làm gì nữa. Tôi phải lưu ý rằng tôi đang sử dụng AddOn Builder để đạt được điều này.

Bên dưới mã có vẻ không hoạt động.

Lựa chọ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(); 

    } 
}); 

}; 

Phương á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); 
      } 
     } 
    }); 
}; 

Trả lời

14

DOMParser constructor không được định nghĩa trong bối cảnh các module SDK. Bạn vẫn có thể có được nó bằng cách sử chrome authority tuy nhiên:

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

nsIDOMParser documentation.

Điều đó nói rằng, cách tiếp cận của bạn với XMLHttpRequest cũng sẽ hoạt động. Tuy nhiên, bạn đã sử dụng toán tử new không chính xác, cách bạn viết nó là "đối tượng yêu cầu" mới đang được tạo. Bằng cách này, nó sẽ làm việc tuy nhiên:

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

Hãy xem xét sử dụng một đối tượng không đồng bộ XMLHttpRequest Tuy nhiên, sử dụng request.onreadystatechange để đính kèm nghe của bạn (module xhr hiện không hỗ trợ các loại thính giả hoặc addEventListener).

+1

+1 vì lợi ích của người dùng của bạn, hãy tránh truy cập mạng đồng bộ dưới bất kỳ hình thức nào! – canuckistani

+0

@canuckistani: Bây giờ nếu chỉ 'xhr' thực hiện các thuộc tính' onload' và 'onevent' đúng;) Các nhà phát triển web có thể được sử dụng để' onreadystatechange' nhưng tôi coi đó là một giải pháp xấu xí. –

+0

@Wladimir Palant. Giải pháp DOMParse hoạt động rất tốt. Tuy nhiên, giải pháp XMLHttpRequest đã ném cho tôi cùng một thông báo lỗi.Tôi đã làm một cái gì đó tương tự như những gì bạn đề nghị tôi với DOMParse: 'var {Cc, Ci} = require (" chrome "); var request = Cc ["@ mozilla.org/xmlextras/xmlhttprequest;1"]. createInstance (Ci.nsIXMLHttpRequest); 'và nó hoạt động !. Cảm ơn bạn – kriztean

3

Nếu bạn sử dụng XMLHttpRequest (có sẵn qua xhr module), bạn có thể dễ dàng tránh việc sử dụng DOMParser. Bellow tôi cung cấp một ví dụ giả request là một đối tượng XMLHttpRequest mà yêu cầu được hoàn thành:

Thay vì:

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

Sử dụng:

var xmlDoc = request.responseXML; 

Một sau đó bạn có thể:

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

Hoặc bất kỳ thứ gì.

+0

trên 'responseXML' bạn có thể làm' xmlDoc.document.body.innerHTML' như bạn có thể với 'DOMParser'? – Noitidart

Các vấn đề liên quan