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 :

Recuperer une chaine XML entre balises avec SAX


Sujet :

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

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Recuperer une chaine XML entre balises avec SAX
    Bonjour !

    Voila je poste parce que visiblement personne ne parle de ce point.
    Je doit récupérer un document XML (ou l'équivalent en String) dans un message XML.

    Traduction: Comment récupérer une partie de document XML si cette partie est elle même de l'XML?

    Voici un exemple de document XML :

    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
    <RACINE>
        <BALISE1 time="matin">
           <BALISEINFORMATION info1="25" info2="10">
     
                      <ENROBAGE>
                            <DOCENROBE lieu="ici" >
                                        <DONNEE>bleu</DONNEE>
                                        <DONNEE>rouge</DONNEE>
                                        <TYPE>normal</TYPE>
                            </DOCENROBE>
                     </ENROBAGE>
     
     
            </BALISEINFORMATION>
        </BALISE1>
    </RACINE>
    Je sais parser avec SAX, d'ailleurs merci à developpez.com et à la communauté pour mettre à disposition toutes ces informations.
    Dans les tutoriaux sur SAX, il est clairement écrit que pour récupérer une valeur entre deux balise on utilise cette méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void characters ( ..., ... , ...) throws SAXException {
     
    }
    Le seul problème c'est que cette méthode récupère une chaine de caractère (C'est valable pour le contenu de <TYPE></TYPE>, on récupère alors normal)

    Comment faire pour récupérer le contenu de <ENROBAGE> ..... </ENROBAGE> ( C'est à dire tout :<DOCENROBE lieu="ici" ><DONNEE>bleu</DONNEE><DONNEE>rouge</DONNEE><TYPE>normal</TYPE></DOCENROBE> ) ?


  2. #2
    Membre éprouvé
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Points : 1 034
    Points
    1 034
    Par défaut
    je te conseille d'utiliser JDOM, en tout cas c'est un choix personnelle, et je pense que la majorité des personnes a qui tu posera la question te recommanderont de pencher sur JDOM.

    parcequ'il est trés facile a manier, et il utilise le standard Document Object Model.
    dans JDOM, les noeuds du fichier xml sont des objets de la classe Element, ils peuvent avoir des fils, qui sont a leurs tours des instances de la classe Element.

    voila comment repondre a ta questions en utilisant JDOM.
    par exemple le fichier xml suivant ("sdf.xml"):

    sdf.xml
    <Etudiants>
    <Etudiant>
    <Name>Mouna</Name>
    </Etudiant>

    <Etudiant>
    <Name>Selim</Name>
    </Etudiant>
    </Etudiants>
    Imagine qu'on veut recuperer la chaine suivante :
    <Etudiant>
    <Name>Mouna</Name>
    </Etudiant>


    le programme trés simple suivant le permet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public static void main(String[] args) throws JDOMException, IOException {
    		Element root = new SAXBuilder().build("sdf.xml").getRootElement(); //on recupere la racine du fichier
    		List<Element> liste = root.getChildren(); //on recupere la liste de ses fils
    		Element mouna = liste.get(0); //on recupere le fils numero1 (qui a <name>Mouna</name>)
    		String s = new XMLOutputter(Format.getPrettyFormat()).outputString(mouna); //on recupere l'element dans un String
    		System.out.println(s); //on l'affiche
    	}
    le resultat de ce programme sera le suivant :
    <Etudiant>
    <Name>Mouna</Name>
    </Etudiant>
    a toi de l'adapter selon tes besoins.

  3. #3
    Membre expérimenté
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Points : 1 464
    Points
    1 464
    Par défaut
    Bonsoir,

    Je me permets de reagir aux remarques de LinkinSelim.

    je te conseille d'utiliser JDOM, en tout cas c'est un choix personnelle, et je pense que la majorité des personnes a qui tu posera la question te recommanderont de pencher sur JDOM.
    Personnelement je n'aime pas JDOM car il ne respecte pas le standard w3c, autrement dit JDOM a cree ses propres notions de Node, Element, ses propres methodes d'acces au noeud. Ceci ne permet pas de faire cohabiter plusieurs Document qui serait charge avec des API differentes qui implementent w3c.


    [UOTE]parcequ'il est trés facile a manier, et il utilise le standard Document Object Model.
    [/QUOTE]

    Justement non, il ne respecte pas le standard w3c Document Object Model.
    Voici le code en utilisant une API (ici sun) qui respecte w3c, il y en a d'autres comme xerces....

    Mais comme dit LinkinSelim, c'est un choix personnel.
    Voici le code avec un Document implementatant w3c :

    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
     
    import java.io.StringWriter;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
     
    import com.sun.org.apache.xml.internal.serialize.OutputFormat;
    import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
     
    public class TestEtudiants {
     
    	public static void main(String[] args) {
    		try {
    			DocumentBuilderFactory factory = DocumentBuilderFactory
    					.newInstance();
    			DocumentBuilder builder = factory.newDocumentBuilder();
    			final Document document = builder.parse(TestEtudiants.class
    					.getResourceAsStream("etudiants.xml"));
     
    			Element mouna = (Element)document.getElementsByTagName("Etudiant").item(0);
     
    			XMLSerializer serializer = new XMLSerializer();
    			OutputFormat format =  new OutputFormat();
    			format.setOmitXMLDeclaration(true);
    			serializer.setOutputFormat(format);
    			StringWriter writer = new StringWriter();
    			serializer.setOutputCharStream(writer);
    			serializer.serialize(mouna);
     
    			System.out.println(writer.getBuffer().toString());
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    	}
    }
    Angelo

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour votre réactivité et pour la pertinence de vos contributions.

    Ce que vous me rapportez est assez contrariant.
    En effet, d'après vos écrits: il est impossible de récupérer un ensemble de document XML (ou une String composé de balises) entre deux balises avec SAX?

    J'ai déjà développé, à l'aide des tutoriaux, une classe qui réalise ce que je souhaite, mais avec DOM.
    Note : pour ce que ça intéresse, comment récupérer le contenu de deux balises, même si c'est du XML, voir par ici

    On peut également utiliser le même code mais à partir d'un Node :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    NodeList		enrobage	= elementEntryNode.getElementByTagName("ENROBAGE");
    Node			enrobage_Emnt	= enrobage.item(0);
     
    DOMSource            	domSource      	= new DOMSource(enrobage_Emnt);
    StringWriter           	writer          = new StringWriter();
    StreamResult          	result          = new StreamResult(writer);
    TransformerFactory	tf       	= TransformerFactory.newInstance();
    Transformer           	transformer     = tf.newTransformer();
    transformer.transform(domSource, result);
    String stringResult 			= writer.toString();
    J'ai voulu passer avec SAX pour plusieurs raison:

    • Avec DOM, lors du parsage du document, celui-ci met automatiquement tous les attributs d'une balise en ordre alphabétique. Cela est assez gênant, je ne veux pas toucher au contenu du message enrobé.
    • Avec DOM, je peux arriver à des temps de traitement allant jusqu'à 120 ms par message (SAX n'utilise que 17 ms par messages).


    Mais SAX ne peut-il pas réaliser cela ?


Discussions similaires

  1. [SimpleXML] recuperer une partie de la balise xml
    Par Krabbos dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 23/06/2011, 14h33
  2. Réponses: 3
    Dernier message: 31/03/2011, 20h03
  3. [RegEx] remplacer une chaine comprise entre 2 balises
    Par Khleo dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2008, 17h02
  4. Réponses: 2
    Dernier message: 06/02/2008, 22h14
  5. [VB.NET] Alimenter un dataset avec une chaine XML...
    Par David.V dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/05/2004, 09h09

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