2011-06-29 40 views
1

我正在編寫Firefox擴展。現在我需要創建一個XML文件的本地副本,並且我幾乎成功了。一個文件被讀取並創建一個新文件,但是這個文件是空的。有沒有XML文件的特殊方法,或者它爲什麼不起作用?使用Javascript爲Firefox擴展創建XML文件的本地副本

這裏的功能是:

function loadXMLDoc(dname) { 
    if (window.XMLHttpRequest) { 
     xhttp = new XMLHttpRequest(); 
    } else { 
     xhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xhttp.open("GET", dname, false); 
    xhttp.send(""); 
    return xhttp.responseXML; 
} 

function localcopy() { 
    var url = content.document.location.href; 
    var prefManagerr = Components.classes["@mozilla.org/preferences-service;1"] 
     .getService(Components.interfaces.nsIPrefService) 
     .getBranch("extensions.foafnet."); 

    var prefStringx; 
    if (prefManagerr.prefHasUserValue("stringpref1")) { 
     prefStringx = prefManagerr.getCharPref("stringpref1"); 
    } else { 
     // Preference is default value so use that 
     prefStringx = "0" 
    } 
    if (prefStringx == url) { 
     xml = loadXMLDoc(prefStringx); 
     var file = Components.classes["@mozilla.org/file/directory_service;1"]. 
     getService(Components.interfaces.nsIProperties). 
     get("TmpD", Components.interfaces.nsIFile); 
     file.append("profiletemp.xml"); 
     file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0666); 
     // do whatever you need to the created file 
     alert(file.path); 
     // 
     var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"]. 
     createInstance(Components.interfaces.nsIFileOutputStream); 
     stream.init(file, 0x04 | 0x08 | 0x20, 0600, 0); // readwrite, create, truncate 

     stream.write(xml, xml.length); 
     if (stream instanceof Components.interfaces.nsISafeOutputStream) { 
      stream.finish(); 
     } else { 
      stream.close(); 
     } 
    } 
} 

第二函數的開始只是聲明,一個本地副本則僅在被叫網站竟同一URL來作爲在擴展的首選項中定義的URL。這部分工作得很好。

回答

0

nsIOutputStream.write()的第一個參數必須是字符串 - 而不是您給它的XML文檔。您可以使用XMLSerializer將XML轉換爲文本並直接將其寫入流中:

new XMLSerializer().serializeToStream(xml, stream, "utf-8");