Создайте локальную копию XML-файла для расширения Firefox, используя Javascript - PullRequest
1 голос
/ 29 июня 2011

Я пишу расширение Firefox.Сейчас мне нужно создать локальную копию файла XML, и я почти успешен.Файл читается и создается новый, но этот пустой.Есть ли специальный метод для файлов 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-адрес, определенный в настройках расширения.эта часть работает просто отлично.

1 Ответ

0 голосов
/ 29 июня 2011

Первый параметр nsIOutputStream.write() должен быть строкой - вместо этого вы даете ему XML-документ. Вы можете использовать XMLSerializer для преобразования XML в текст и прямой записи его в поток:

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