Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

Aller à la page :  1 2

# Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Raphael

Date : 09/12/2006 14:55

Bonjour, mon appli. utilise un stockage dans une base SQLi3te pour fonctionner. Néanmoins, je voudrais pouvoir importer/exporter mes données dans un format XML que j'aurais défini. J'ai fait pas mal de recherche sur le sujet et quelques tests en XUL mais rien de totalement concluant, c'est pourquoi j'aurais besoin d'un peu d'aide sur le sujet.

  • 1) Est-ce que j'ai besoin d'un fichier Relax NG (.rng) pour que mon logiciel sache interpréter mon fichier nommé ".xyd" (pour XML Yugioh Deck). En étudiant les spécifications de ce type de schéma, j'en ai créé un, mais je ne sais pas si c'est utile ou pas.
  • 2) Sur le Wiki, à propos de E4X, j'ai suivi les instructions pour accéder à mes données de cette manière :
var people = <people>
       <person id="1">
            <name>Moe</name>
      </person>
      <person id="2">
            <name>Larry</name>
      </person>
   </people>;
alert(people.person[0].name);

Ceci marche, maintenant il faudrait que je puisse charger mon fichier XML (.xyd) dans ma variable "people". J'ai essayé de me baser sur le Wiki et la lecture d'un fichier XML comme suit :

function lecture(url) {
  //url : adresse chrome:// ou http://, absolue ou relative
   var baseurl= window.location.toString();
   var uri = Components.classes['@mozilla.org/network/standard-url;1']
            .createInstance(Components.interfaces.nsIURI);
   uri.spec=baseurl;
   //Résolution de l'URL du fichier par rapport à l'URL de la fenêtre de l'application
   var strUrlFichier = uri.resolve(url);
   uri.spec=strUrlFichier;
   //Ouvrir un canal correspondant à cette URL
   var ios = Components.classes['@mozilla.org/network/io-service;1']
            .getService(Components.interfaces.nsIIOService);
   var chann = ios.newChannelFromURI ( uri );
   //Charger le document depuis ce canal
   var domsrv = Components.classes['@mozilla.org/content/syncload-dom-service;1']
               .getService(Components.interfaces.nsISyncLoadDOMService);
   var doc = domsrv.loadDocumentAsXML( chann , uri);
   //doc est un objet XMLDocument
   return doc;
}
function rempli() {
 //lance la lecture avec l'URI de la <textbox>
 var doc = lecture( document.getElementById('nom_fichier').value );
 var people = new XML(doc);
 alert(people.person[0].name);
}

Malheureusement, ça ne marche pas...

Voici mon fichier xml :

<?xml version="1.0" encoding="UTF-8"?>
<people>
      <person id="1">
            <name>Moe</name>
      </person>
      <person id="2">
            <name>Larry</name>
      </person>
</people>

Voilà, en fait la question est assez simple : Quelles sont les commandes pour :

  • créer un fichier XML (Est-ce très manuel genre "write ..." ou bien y -a-t-il des outils pour simplifier ?)
  • lire un fichier XML pour récupérer les informations et les stocker dans ma base de données

Merci beaucoup.

# Re: Lire/Générer un XML : E4X ? DOM ? Besoin d'un schéma Relax NG ?

Envoyé par : laurentj

Date : 11/12/2006 15:41

créer un fichier XML :

  • tu crée un document DOM
  • tu manipule le DOM pour ajouter ce que tu veux dans ton dom
  • tu serialize le document (XMLSerializer) tu obtiens ainsi une chaine
  • tu stocke la chaine dans un fichier comme n'importe quel contenu texte

lire un fichier :

l'exemple que tu as pris est fait pour les fichiers xml distants, pas locaux.

# Re: Lire/Générer un XML : E4X ? DOM ? Besoin d'un schéma Relax NG ?

Envoyé par : thefab

Date : 11/12/2006 19:14

Je n'ai pas regardé dans le détail, mais ton code devrait fonctionner, le problème c'est que E4X n'accepte pas la première ligne du fichier XML:

<?xml version="1.0" encoding="UTF-8"?>

# Re: Lire/Générer un XML : E4X ? DOM ? Besoin d'un schéma Relax NG ?

Envoyé par : Raphael

Date : 11/12/2006 21:25

Ah ben justement, c'est marrant que tu en parles car j'allais justement poster sur ce problème !

En fait, j'ai réussi à lire mon fichier et à y accéder via E4X qui est d'ailleurs SUPER PRATIQUE pour accéder aux données via ce code :

<script><![CDATA[
function rempli() {
 var uri = "/home/raph/Programmation/YDM/chrome/content/dialogs/test1.xml";
 var txt = read(uri);
 document.getElementById('contenu').value = txt;
 //Un peu de cosmétique, affichage du chemin du fichier en bas de la fenêtre
 document.getElementById('nom_fichier').value = "Fichier : " + uri;
 var people = new XML(txt);
 alert(people.person[1].name);
}
function read(filepath) {
try  {
 //On autorise le navigateur a ouvrir des fichiers locaux
 //si par exemple, le script n'est pas lancé depuis une adresse chrome
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
 alert("Permission refusée de lire le fichier");
 return ;
}
//Le fichier est ouvert
var file =  Components.classes["@mozilla.org/file/local;1"]
           .createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(filepath);
if ( file.exists() != true) {
 alert("Le fichier "+filepath+" n'existe pas");
 return ;
}
//Mode de lecture du fichier, un flux est nécessaire
//Le second argument définit les différents modes de lecture parmis
//PR_RDONLY     =0x01 lecture seulement
//PR_WRONLY     =0x02 écriture seulement
//PR_RDWR       =0x04 lecture ou écriture
//PR_CREATE_FILE=0x08 si le fichier n'existe pas, il est créé (sinon, sans effet)
//PR_APPEND     =0x10 le fichier est positionné à la fin avant chaque écriture
//PR_TRUNCATE   =0x20 si le fichier existe, sa taille est réduite à zéro
//PR_SYNC       =0x40 chaque écriture attend que les données ou l'état du fichier soit mis à jour
//PR_EXCL       =0x80 idem que PR_CREATE_FILE, sauf que si le fichier existe, NULL est retournée
//Le troisième argument définit les droits
var is = Components.classes["@mozilla.org/network/file-input-stream;1"]
        .createInstance( Components.interfaces.nsIFileInputStream );
is.init(file, 0x01, 00004, null);
//Lecture du fichier en mode binaire
var sis = Components.classes["@mozilla.org/binaryinputstream;1"]
         .createInstance(Components.interfaces.nsIBinaryInputStream);
sis.setInputStream( is );
var output = sis.readBytes( sis.available() );
//Le contenu du fichier est retourné
return output;
}
]]></script>
<html:h1>Test de lecture d'un fichier</html:h1>
<hbox style = "overflow: auto;" flex="1">
 <textbox id="contenu" multiline="true" flex="1" />
</hbox>
<label value="..." id="nom_fichier"/>
</window>

Mais ça marche en prenant comme fichier XML :

<people>
      <person id="1">
            <name>Moe</name>
      </person>
      <person id="2">
            <name>Larry</name>
      </person>
</people>

Si jamais l'on rajoute la 1ère ligne :

<?xml version="1.0" encoding="UTF-8"?>

Effectivement, ça ne marche plus...

Est-ce dû à la jeunesse de cette technologie ? Peut-on y remédier en bidouillant, genre un replace() pour effacer la 1ère ligne avant d'utiliser E4X ?

A votre avis, dois-je apprendre à utiliser la méthode que tu décris Laurent ? Elle parait quand même moins accessible à mon niveau de compréhension que E4X.

Sinon, bien que j'arrive à peu près à lire un fichier XML donc, j'ai du mal quant à la création d'un fichier, qu'il soit XML ou pas... Quelqu'un peut-il me donner les 3 lignes de codes qui servent à créer un fichier ?

Merci d'avance pour vos conseils.

PS : Je test XULBooster en ce moment avec Eclipse, c'est plutôt pratique même si pas encore fini (manque l'indentation auto, etc...)

# Re: Lire/Générer un XML : E4X ? DOM ? Besoin d'un schéma Relax NG ?

Envoyé par : thefab

Date : 11/12/2006 23:39

Quelqu'un peut-il me donner les 3 lignes de codes qui servent à créer un fichier ?

4 en fait ;-) et elles se trouvent sur MDC:

var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
  .createInstance(Components.interfaces.nsIFileOutputStream);
foStream.init(file, 0x02 | 0x08 | 0x20, 0664, 0);
foStream.write(data, data.length);
foStream.close();

# Re: Lire/Générer un XML : E4X ? DOM ? Besoin d'un schéma Relax NG ?

Envoyé par : Raphael

Date : 12/12/2006 07:59

Woh, merci à toi, je ne connaissais pas cette doc. Pour l'instant, je me débrouillais avec le Wiki et XULPlanet.

Merci bien. Sinon, concernant la ligne xml, penses-tu que mon idée soit viable ou existe-t-il une solution moins bidouillée pour faire marcher E4X avec un fichier XML standard ?

# Re: Lire/Générer un XML : E4X ? DOM ? Besoin d'un schéma Relax NG ?

Envoyé par : Raphael

Date : 12/12/2006 15:08

Bon, mon code, c'est de la grosse bidouille mais ça marche !

Mon fichier XML :

<?xml version="1.0" encoding="UTF-8"?>
<people>
 <person id="1">
  <name>Moe</name>
 </person>
 <person id="2">
  <name>Larry</name>
 </person>
</people>

Mon code pour utiliser E4X :

var txt_modif = txt.replace(/\<\?xml version="1.0" encoding="UTF-8"\?\>/,"");
var people = new XML(txt_modif);
alert(people.person[1].name);

Et ça marche... mais bon, j'ai pas fait mon M. Propre sur le coup... ^_^"

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Raphael

Date : 13/12/2006 14:07

Bon, en continuant mon expérience avec E4X, il semblerait qu'il ne travaille pas en UTF-8 non ?

Car tous mes fichiers sont encodés en UTF-8 : JS, XUL, XML,... Et lorsque je récupère mes données de mon fichier XML avec E4X, et bien mes accents ne passent pas bien.

Déjà que j'ai dû bidouillé pour enlever la 1ère ligne... C'est moi ou bien E4X n'est pas très utilisable en production ?

Devrais-je passer plutôt par le DOM selon vous ?

PS : Si je poursuis avec E4X, existe-t-il une fonction Javascript qui encode en UTF-8 ?

PPS : Après moultes recherches sur le sujet :

  • je n'ai trouvé aucune fonction JS triviale pour récupérer le contenu de E4X en UTF-8...
  • Je ne comprends absolument pas toutes ces méthodes de lecture de fichier ! Ainsi, sur le Wiki et sur XULPlanet, on peut voir une certaine approche utilisant :
var is = Components.classes["@mozilla.org/network/file-input-stream;1"]
        .createInstance( Components.interfaces.nsIFileInputStream );
is.init(file, 0x01, 00004, null);
//Lecture du fichier en mode binaire
var sis = Components.classes["@mozilla.org/binaryinputstream;1"]
         .createInstance(Components.interfaces.nsIBinaryInputStream);
sis.setInputStream( is );
var output = sis.readBytes( sis.available() );

Alors que sur la Documentation de Mozilla, on peut y voir :

var data = "";
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]
                       .createInstance(Components.interfaces.nsIFileInputStream);
var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"]
                       .createInstance(Components.interfaces.nsIScriptableInputStream);
fstream.init(file, -1, 0, 0);
sstream.init(fstream); 
var str = sstream.read(4096);
while (str.length > 0) {
 data += str;
 str = sstream.read(4096);
}
sstream.close();
fstream.close();
alert(data);

Et je ne comprends absolument pas la différence... Quelqu'un pourrait-il éclairer ma lanterne ?

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Raphael

Date : 14/12/2006 21:50

Désolé de ne faire que répondre à moi-même mais je lis tellement de trucs contradictoires sur divers sites que je ne sais plus ce qui est d'actualité ou pas ? J'ai par exemple lu que la méthode .load() était désuète ?

Les fonctions que j'ai écrite plus-haut pour la lecture, sont-elle incontournables pour lire un fichier XML ? Car je remarque le code suivant à pas mal d'endroits :

var xmlDoc= document.implementation.createDocument("","",null);
xmlDoc.load("note.xml");

Est-ce que ces 2 seules lignes suffisent à lire un fichier XML ? Car je n'arrive pas à accéder à mes donnée en utilisant le DOM alors que je devrais pouvoir non ?

Bref, je suis perdu dans cette jungle de lecture/écriture. Pour moi, tout ce qui traine sur le net est très loin d'être clair. Je ne demande pourtant pas la mer à boire : Juste lire et traiter un XML, et pouvoir en créer un...

Please Help (désolé pour tous mes messages et mes questions).

EDIT : Après encore de nombreuses heures de recherche, je suis tombé sur un script qui me semble vraiment bien : io.js (http://kb.mozillazine.org/Io.js) qui contient des fonctions de lecture/écriture très pratique NOTAMMENT AU NIVEAU DE L'ENCODAGE... Car par défaut, je me suis rendu compte que la fonction de lecture lit en ISO et non dans l'encodage du fichier (car mon fichier XML est a priori en UTF-8 !). Ce qui fait qu'en utilisant ce fichier, j'arrive à travailler mon fichier de cette façon :

var xml_content = FileIO.read(file,'utf-8');
var xml_content = xml_content.replace(/\<\?xml version="1.0" encoding="UTF-8"\?\>/,"");
var deck_xml = new XML(xml_content);

Je m'attaquerai demain à ma fonction de création/écriture via E4X.

Cependant, mes interrogations restent toujours valable si quelqu'un se sent l'énergie d'y répondre ? Merci.

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Barsy

Date : 03/07/2007 14:27

Je relance le sujet. ça fait plusieurs heures que je tente d'adapter le code de lecture de raphael sans succès. Je ne m'en sors pas.

pourtant j'utilise le code "read()" qu'il a tapé. Je n'arrive à pas en sortir d'information.

Je ne sais pas du tout à quoi servent les lignes du type :

Components.classes["@mozilla.org/binaryinputstream;1"]
        .createInstance(Components.interfaces.nsIBinaryInputStream);

N'existe-t-il aucun moyen simple de lire ou d'écrire dans un fichier ?

PS : j'ai tenté d'utiliser la bibliothèque Io.js donnée dans le post précédent sans plus de succès...

PPS : Je pense avoir résolu le problème. C'est mon adresse qui n'est pas bonne.

J'ai tenté : "C:\Program Files\Mozilla Firefox\chrome\mon_dossier\mon_fichier.xml" et "chrome://mon_dossier/content/mon_fichier.xml"

et aucune ne marche...

j'ai aussi testé "mon_fichier.xml"

PPPS : C'est bon, c'est simplement que j'avais oublié de doubler les \ maintenant il ne me reste plus qu'à trouver le moyen d'écrire dans le fichier

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Barsy

Date : 03/07/2007 17:44

J'ai enfin réussi à ouvrir et à écrire correctement dans un fichier.

Maintenant un autre problème se pose à moi (je suis désolé, je débute complétement en XUL).

je n'arrive pas à créer de nouvelles balises dans le document XML que j'ai ouvert. J'arrive très bien à modifier le contenu de ces balises et à réécrire dans le fichier. Mais impossible d'en rajouter.

Je vous donne mon code :

var adr = "C:\\Program Files\\Mozilla Firefox\\chrome\\mon_dossier\\mon_fichier.xml";
var txt = read(adr)
var docXML = new XML(txt);
newPeople = docXML.createElement("person");
docXML.appendChild(newPeople);
alert(docXML);
ecrire(adr,""+docXML);

le alert() devrait m'afficher la page XML avec la balise que je viens de créer. Au lieu de ça, j'ai une erreur qui me dit

Erreur : docXML.createElement is not a function
Fichier source : chrome://mon_dossier/content/mon_fichier.js
Ligne : 41

Merci pour votre aide.

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : thefab

Date : 03/07/2007 17:53

Quand tu fais new XML() tu utilises E4X donc tu ne peux pas utiliser appendChild qui est une méthode DOM.

Avec E4X c'est simple (c'est le but):

var docXML = new XML(txt);
docXML.person = "Moi";
alert(docXML);

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Barsy

Date : 03/07/2007 18:21

oui, j'ai déjà essayer ça. Mais ça ne fait que remplacer le "person" déjà existant et ça n'en crée pas de nouvelles.

J'ai aussi essayé en faisant un

docXML.person[1]="Moi";

mais ça me retourne une erreur.

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : Raphael

Date : 03/07/2007 19:28

Je ne sais pas trop, en fait moi je n'écris pas au fur et à mesure en fait, j'écris tout d'un coup donc je n'ai pas de souci.

Sinon, pour les fichiers, je serais toi je n'utiliserais pas des chemins en "dur" car c'est spécifique à Windows (ou Linux)... tu devrais utiliser nsIFile qui est fait pour manipuler les fichiers, les chemins, et tout ça indépendamment de l'OS, ce qui fait que ton application sera bien multi-plateformes =)

# Re: Lire/Générer un XML : E4X ou DOM ? E4X semble jeune et travaille en ISO non ?

Envoyé par : thefab

Date : 04/07/2007 11:04

Pour créer des sous-éléments tu dois le faire en 2 fois (si mes souvenirs sont bons)

var docXML = new XML("<doc/>");
var person1 = new XML("<person>1</person>");
var person2 = new XML("<person>2</person>");
docXML.person[1] = person1;
docXML.person[2] = person2;

Voici le code que j'utilise pour convertir un tableau à deux dimensions gData en XML:

var data = new XML("<data/>");

for (var i = 0; i < gData.length; i++)
    {
    var row = new XML("<row/>");

    for (var j = 0; j < gData[i].length; j++)
        {
        var column = new XML("<column>" + gData[i][j] + "</column>");
        row.column[j] = column;
        }

    data.row[i] = row;
    }

var buffer = data.toString();

Aller à la page :  1 2

Il n'est plus possible de poster des messages dans ce forum.


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.