Forum Programmation.java Parser XML

Posté par  (site web personnel) .
Étiquettes : aucune
0
8
mar.
2005
Salut,

C'est peut-être un peu hors sujet ... mais étant mon site préféré, c'est ici que je poste.

Je veux stocker des infos dans un fichier et je me dis que XML est une solution propre. J'écrirais un fichier du style


[?xml version="1.0" ?]
[??]
[element]
[foo]Information[/foo]
[bar]Information[/bar]
[/element]
[element]
...
[/element]
[/??]


Comment fais-je pour récupérer ces infos ? Je pense que l'API DOM est peut-être trop lourde pour ce que je veux faire.

Je dois donc utiliser SAX si j'ai bien lu (mais peut-être existe-t-il quelque chose d'autres).

Une ame charitable peut me diriger vers un tutorial ou me donner les lignes de code qui vont bien pour me permettre de débuter. J'imagine pouvoir ouvrir mon fichier et pouvoir faire un truc du style

while ( (node = foo.getNode("element")) != null ) {
node.getText("foo") ;
node.getText("bar") ;
// on passe au noeud suivant
}


Merci
  • # netbeans

    Posté par  . Évalué à 0.

    Salut,

    Netbeans permet de generer automatiquement un parser SAX a partir d'un document XML et/ou d'une DTD. A la fin du processus tu obtiendras une classe avec des méthodes start/stop pour tous tes tags. ( bouton droit sur un document XML pour la génération )

    Sinon pour DOM/SAX : DOM ca permet de charger entierement un document et de se balader dedans comme un graphe, alors que SAX ca lit le document ligne par ligne et ca génere des évenements ( start , stop, content ).
    • [^] # Re: netbeans

      Posté par  (site web personnel) . Évalué à 1.

      Merci mais ça ne répond pas à ma question.

      Je connais le principe de DOM et SAX mais ne sais pas encore le mettre en oeuvre.

      Je ne cherche pas un bouton magique dans un IDE mais je veux comprendre le principe et le faire à la main. (J'utilise pas d'IDE pour l'instant pour diverses raisons).
      • [^] # Re: netbeans

        Posté par  . Évalué à 4.

        Alors ca ressemble à ca, et il te faudra modifier les méthodes start/stop pour le traitement.
        import java.io.FileReader;
        
        import org.xml.sax.XMLReader;
        import org.xml.sax.Attributes;
        import org.xml.sax.InputSource;
        import org.xml.sax.helpers.XMLReaderFactory;
        import org.xml.sax.helpers.DefaultHandler;
        
        
        public class MySAXApp extends DefaultHandler
        {
        
            public static void main (String args[])
                throws Exception
            {
                XMLReader xr = XMLReaderFactory.createXMLReader();
                MySAXApp handler = new MySAXApp();
                xr.setContentHandler(handler);
                xr.setErrorHandler(handler);
        
                                        // Parse each file provided on the
                                        // command line.
                for (int i = 0; i < args.length; i++) {
                    FileReader r = new FileReader(args[i]);
                    xr.parse(new InputSource(r));
                }
            }
        
        
            public MySAXApp ()
            {
                super();
            }
        
        
            ////////////////////////////////////////////////////////////////////
            // Event handlers.
            ////////////////////////////////////////////////////////////////////
        
        
            public void startDocument ()
            {
                System.out.println("Start document");
            }
        
        
            public void endDocument ()
            {
                System.out.println("End document");
            }
        
        
            public void startElement (String uri, String name,
                                      String qName, Attributes atts)
            {
                if ("".equals (uri))
                    System.out.println("Start element: " + qName);
                else
                    System.out.println("Start element: {" + uri + "}" + name);
            }
        
        
            public void endElement (String uri, String name, String qName)
            {
                if ("".equals (uri))
                    System.out.println("End element: " + qName);
                else
                    System.out.println("End element:   {" + uri + "}" + name);
            }
        
        
            public void characters (char ch[], int start, int length)
            {
                System.out.print("Characters:    \"");
                for (int i = start; i < start + length; i++) {
                    switch (ch[i]) {
                    case '\\':
                        System.out.print("\\\\");
                        break;
                    case '"':
                        System.out.print("\\\"");
                        break;
                    case '\n':
                        System.out.print("\\n");
                        break;
                    case '\r':
                        System.out.print("\\r");
                        break;
                    case '\t':
                        System.out.print("\\t");
                        break;
                    default:
                        System.out.print(ch[i]);
                        break;
                    }
                }
                System.out.print("\"\n");
            }
        
        }
        
        • [^] # Re: netbeans

          Posté par  (site web personnel) . Évalué à 1.

          Bon, j'ai testé, j'arrive à afficher le contenu de mon fichier.

          Si je ne mets pas en oeuvre SAX, je suis obligé de gérer le fichier "comme u fichier texte" et écrire dans des méthodes qui vont bien pour retourner les infos qui m'intéressent.

          Du genre j'ajoute à la classe des champs

          String foo;
          String bar;


          Et dans la méthode startElement , je mets les attributs à jour. J'ajoute aussi un attribut me signalant lorsque je passe à l'élément suivant et la méthode qui met ce champ à jour ....

          J'ai bon ?
          • [^] # Re: netbeans

            Posté par  . Évalué à 1.

            Oui tu peux faire ça, l'appel à la méthode endElement() avec le nom de tag "element" t'indiquant quand un élement a été lu.

            Pense a bien verifier que le fichier xml valide la DTD correspondante, sinon tu risques de trouver dans cette situation :

            <element>
            <foo>a</foo>
            <bar>a</bar>
            </element>
            <element>
            <foo>b</foo>
            </element>

            donnant

            (element)[foo=a,bar=a]
            (element)[foo=b,bar=a]

            sinon remets à null les chaines foo et bar lorsqu'un élement à été parsé.

            -----------------------------------------

            Pour revenir sur DOM et SAX, en général :

            On utilise un parser DOM pour manipuler un document, traverser le document en pouvant revenir en arriere, et ce pour des petits documents , car cela consomme beaucoup de mémoire.

            On utilise un parser SAX quand un document ne subira pas de modification de structure, ou pour des gros documents.
  • # Digester

    Posté par  . Évalué à 6.

    Digester répond parfaitement à ton besoin. Il permet de parser un fichier XML dont tu as défini la grammaire et de renvoyer tout ça sous forme d'un objet (pour simplifier). Si la grammaire de ton fichier est simple, ça ne te prendra pas trop temps et en tout cas moins que d'utiliser SAX.

    http://jakarta.apache.org/commons/digester/(...)

    Un tutoriel assez simple :

    http://www.onjava.com/pub/a/onjava/2002/10/23/digester.html(...)
    • [^] # Re: Digester

      Posté par  (site web personnel) . Évalué à 2.

      Ca répond tout bien à ma question ... merci.

      Si quelqu'un passe par ici, il peut plussoyer notre ami bleh ...
    • [^] # Re: Digester

      Posté par  . Évalué à 1.

      Salut

      Je débarque dans le XML et l'univers des parsers etc... qui va avec.

      J'ai le même objectif et Digester me plait aussi beaucoup.
      J'ai un besoin supplémentaire cependant : transformer un objet en fichier XML. Un Digester inverse en gros.

      En résumé :
      1. en input, j'ai des fichiers XML validant une DTD1
      2. en output, je dois fournir des fichiers XML validant une DTD2

      J'ai donc besoin de faire une transformation, et ça me semble une bonne idée de passer par un objet.

      Digester solutionne le point 1.
      Quid du point 2 ?

      Merci d'avance.
      • [^] # Re: Digester

        Posté par  . Évalué à 2.

        salut,

        je ne crois pas que digester permette la serialisation d'un object en xml.

        Pour transformer ton schéma 1 en schéma 2, si j'étais toi j'utiliserais une XSLT, qui permet de transformer un document XML en un autre document XML.

        Si tu veux absolument convertir en utilisant des objets , tu veux allez voir du coté de JAXB.( Java Architecture for XML Binding ).

        Tu devrais pouvoir génerer un objet pour ton schéma 1 avec moyen de le serialiser/desérialiser et un objet pour ton schéma 2 avec moyen de le sérialiser/désérialiser, a toi ensuite de peupler les champ de l'objet 2 avec les valeurs de l'objet 1.

        http://java.sun.com/xml/jaxb/about.html(...)
  • # Bibliothèque TinyXml

    Posté par  (site web personnel) . Évalué à 1.

    Pour quelque chose d'assez léger, il y a TinyXML qui permet de faire ça très bien.
    C'est du C++ mais ce n'est pas une usine à gaz, genre 2 fichiers à linker, c'est tout...

    http://sourceforge.net/projects/tinyxml(...)

    Bye.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.