IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Transformation avec SAX


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut Transformation avec SAX
    Bonjour,

    Voici l'exercice que l'on m'a donné à faire dan sle cadre de ma formation :

    Je dois transformer un fichier XML d'un format vers un autre.

    Fichier source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <Topic>
        <SubTopics>
            <Topic>
                <SubTopics/>
                <Text PlainText="..."/>
            </Topic>
        </SubTopics>
        <Text PlainText="..."/>
    </Topic>
    Fichier à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <node TEXT="...">
        <node TEXT="..."/>
    </node>
    Je dois faire ceci exclusivement avec SAX, sans utiliser d'objet DOM..

    Voici mon ContentHandler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    package sax.converter;
    import org.xml.sax.*;
    import org.xml.sax.helpers.LocatorImpl;
    import java.io.*;
     
    public class SAXContentHandlerMMToFM implements ContentHandler {
     
    	DataOutputStream fs;	
     
        public SAXContentHandlerMMToFM() {
            super();
            // On definit le locator par defaut.
            locator = new LocatorImpl();
            try
    		{
    			fs = new DataOutputStream ( new FileOutputStream("c:/Formation/xmlSaxOut.xml") );
    		}
    		catch (IOException e) { System.out.println(e); }
        }
     
        public void setDocumentLocator(Locator value) {
            locator =  value;
        }
     
        public void startDocument() throws SAXException {
            try
            {
            	fs.writeChars("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
            	fs.writeChars("<map version=\"0.8.0\">\n");
            }
            catch (IOException e) { System.out.println(e); }
     
        }
     
        public void endDocument() throws SAXException {
            try
            {
            	fs.writeChars("</map>");
            	fs.close();
            }
            catch (IOException e) { System.out.println(e); }
        }
     
        public void startPrefixMapping(String prefix, String URI) throws SAXException {}
     
        public void endPrefixMapping(String prefix) throws SAXException {}
     
        public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs) throws SAXException {
            try
            {
            	if (localName == "Topic")
            	{
            		fs.writeChars("<node POSITION=\"right\" ");
            	}
            	else if (localName == "Text")
            	{
            		fs.writeChars("TEXT=\"");
            		for (int index = 0; index < attributs.getLength(); index++) { // on parcourt la liste des attributs
                        if (attributs.getLocalName(index) == "PlainText")
                        {
                        	fs.writeChars(attributs.getValue(index) + "\">");
                        }                    	
                    }
            	}
            }
            catch (IOException e) { System.out.println(e); }
        }
     
        public void endElement(String nameSpaceURI, String localName, String rawName) throws SAXException {
            try
            {
            	if (localName == "Topic")
            	{
            		fs.writeChars("</node>\n");
            	}
            	else if (localName == "Text")
            	{}
            }
            catch (IOException e) { System.out.println(e); }
        }
     
        public void characters(char[] ch, int start, int end) throws SAXException {}
     
        public void ignorableWhitespace(char[] ch, int start, int end) throws SAXException {}
     
        public void processingInstruction(String target, String data) throws SAXException {}
     
        public void skippedEntity(String arg0) throws SAXException {
            // Je ne fais rien, ce qui se passe n'est pas franchement normal.
            // Pour eviter cet evenement, le mieux est quand meme de specifier une dtd pour vos
            // documents xml et de les faire valider par votre parser.              
        }
     
        private Locator locator;
     
    }
    Mon problème, c'est que dans le fichier source, le texte est une balise qui vient après les noeuds fils (/SubTopics/Topic) or, dans mon fichier ) produire, je dois insérer le texte comme attribut du noeud (<node>) et donc avant de faire apparaître les noeuds fils..

    Comme SAX est évènementiel, je ne vois pas comment traiter d'abord un élément qui vient après un autre..

  2. #2
    Membre expérimenté Avatar de ze_corsaire
    Inscrit en
    Décembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2007
    Messages : 240
    Par défaut
    Bonjour,

    Mon idée serait de garder, pour chaque handler, une référence vers le handler père.
    Ensuite, il vaut mieux raisonner sur la fermetrure d'une balise et non son ouverture :
    - A la fermeture de la balise imbriquée tu récupères le texte, tu récupères aussi l'instance d'handler sur la balise topic en remontant de père en père et tu lui positionnes le texte trouvé
    - A la fermeture de la balise topic il ne te reste plus qu'à finir le travail

    ________________

  3. #3
    Membre expérimenté Avatar de ze_corsaire
    Inscrit en
    Décembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2007
    Messages : 240
    Par défaut
    Remarque, tu n'as pas besoin de récupérer les handler pères, tu peux utiliser une variable statique que tu renseignes à la fin de la balise imbriquée, et que t'ulises à la fin de la balise topics

    ________________

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Merci pour ces indications, c'est une belle piste que tu me proposes. Va falloir que je jongle avec les handlers et ça ça ne m'enchante guère...

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Sinon existe-t-il un moyen de parcourir les noeuds de bas en haut, toujours avec SAX ?

Discussions similaires

  1. [XSLT] XML-->XSLT output format apres transformation avec un x
    Par Hoegaarden dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 06/09/2010, 11h51
  2. [SAX] [XSLT] Problème transformation XSL avec SAX et namespace
    Par thierry_b dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 17/12/2008, 14h24
  3. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20
  4. [Conseil][Amélioration]Parser un Document (JDOM) avec SAX
    Par leminipouce dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 19/12/2005, 14h30
  5. [SAX] parsing avec sax
    Par jdar dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 03/12/2004, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo