Voici comment modifier un contenu XML stocké dans un fichier local.
Peut être connaissez-vous à partir de votre application le chemin complet du fichier à modifier, auquel cas vous pouvez passer à la section suivante. Mais bien souvent, on ne le connait pas lorsque l'on veut lire ou stocker un fichier dans le profil de l'utilisateur. Voici donc une petite fonction permettant de récupérer le chemin complet d'un fichier qui est dans le profil :
function getFilePathInProfile(aRelativePath) {
// on récupère un objet nsIFile qui represente le repertoire du profil
// de l'utilisateur
var file = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties)
.get("ProfD", Components.interfaces.nsIFile);
// on y ajoute le chemin relatif donné
var path = aRelativePath.split("/");
for (var i = 0, sz = path.length; i < sz; i++) {
if (path[i] != "")
file.append(path[i]);
}
return file.path;
}
Par exemple, imaginons que l'on veuille travailler sur le fichier monappli/datas.xml dans le profil, on appellera alors :
var fullPath = getFilePathInProfile("monappli/datas.xml");
Voici une fonction permettant de lire un fichier XML locale. Elle retourne un objet DOMDocument representant le contenu de ce fichier :
function readXMLDocument(aPath) {
// objet representant le fichier à lire
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(aPath);
// initialisation d'un flux sur le fichier
var stream = Components.classes["@mozilla.org/network/file-input-stream;1"]
.createInstance(Components.interfaces.nsIFileInputStream);
stream.init(file, -1, -1, Components.interfaces.nsIFileInputStream.CLOSE_ON_EOF);
// creation d'un parser DOM,
var parser = Components.classes["@mozilla.org/xmlextras/domparser;1"]
.createInstance(Components.interfaces.nsIDOMParser);
// generation d'un DOM à partir du flux
var doc = parser.parseFromStream(stream, null, file.fileSize, "text/xml");
parser = null;
stream = null;
file = null;
return doc;
}
Avec cet objet DOMDocument, obtenu, vous pouvez modifier les données, en utilisant les objets DOM habituels. Exemple :
var fullPath = getFilePathInProfile("monappli/datas.xml");
var doc = readXMLDocument(fullPath);
// modifions maintenant le DOM comme on souhaite...
doc.getElementsByTagName('user')[1].textContent = 'toto';
var user = doc.createElement('user');
user.textContent = 'robert';
doc.documentElement.appendChild(user);
Ensuite, vous sauverez le DOMDocument dans le fichier, comme indiqué ci-après.
Voici la fonction permettant de sauver un DOM. On lui livre le DOMDocument, ainsi que le chemin du fichier
function saveXMLDocument(aDomDoc, aPath) {
// objet representant le fichier à écrire
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(aPath);
// initialisation d'un flux sur le fichier
var stream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance(Components.interfaces.nsIFileOutputStream);
stream.init(file, -1, -1, 0);
var encoder = Components.classes["@mozilla.org/layout/documentEncoder;1?type=text/xml"]
.createInstance(nsIDocumentEncoder);
encoder.init(aDomDoc, "text/xml", 0);
encoder.encodeToStream(stream);
encoder = null;
stream = null;
file = null;
}
Ainsi, en continuant l'exemple précedent, on l'utilisera comme ceci :
saveXMLDocument(doc, fullPath);
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.