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 :

Probème de parse d'un Xml avec des contenus mixtes


Sujet :

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

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Probème de parse d'un Xml avec des contenus mixtes
    Quelqu'un pourrait m'aider comment parser un flux Xml avec des contenus mixtes. J'ai utilisé un parseur Sax qui marche avec le simple contenu (#PCDATA) mais quand je suis arrivé sur un élément qui contient d'autres éléments et des textes, il n'arrive pas à atteindre les contenus de l'élément parents (seulement celui des fils).
    Voici le fichier xml que j'ai essayé de parser avec sax:

    Code XML : 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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE annuaire [
    <!ELEMENT annuaire (personne*)>
    <!ELEMENT personne (nom?, prenom?, adresse?, categorie?)>
    <!ELEMENT nom (#PCDATA)*>
    <!ELEMENT prenom (#PCDATA)*>
    <!ELEMENT adresse (#PCDATA)*>
    <!ELEMENT categorie (#PCDATA | cat1 | cat2)*>
    <!ELEMENT cat1 (#PCDATA)*>
    <!ELEMENT cat2 (#PCDATA)*>
    ]>
    <annuaire>
    	<personne>
    		<nom>Albert</nom>
    		<prenom>Franck</prenom>
    		<adresse>Montpellier</adresse>
    		<categorie>Adulte
    		<cat1>Etudiant</cat1>
    		<cat2>mal</cat2>
    		</categorie>	
    	</personne>
    </annuaire>

  2. #2
    Membre éprouvé Avatar de laurentibus
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 908
    Points
    908
    Par défaut
    sans ton code java je pense qu on va avoir du mal a te dire ce qui ne va pas

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par laurentibus Voir le message
    sans ton code java je pense qu on va avoir du mal a te dire ce qui ne va pas
    C'est juste!! Voici mon parseur :
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    /*
     * L'objectif est de transformer un flux xlm en objets Java : personne   et  categorie
     */
     
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.DTDHandler;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    import dao.CategorieDao;
     
    public class PersonneHandler extends DefaultHandler implements DTDHandler {
     
       private HashSet<Personne> annuaire;
       private Categorie categorie = null;
       private HashMap<String, Categorie> listCategorie;
       private Personne personne;
       //flags nous indiquant la position du parseur
       private boolean inCategorie, inAnnuaire, inPersonne, inNom, inPrenom, inAdresse, inCat1, inCat2;
     
       // simple constructeur
       public PersonneHandler(){
          super();	
     
       }
       //détection d'ouverture de balise
       public void startElement(String uri,
                             String localName,
                             String qName,
                             Attributes attributes)
                      throws SAXException{
          System.out.println(uri+" "+localName+" "+qName);
          if(qName == "annuaire"){
             annuaire = new HashSet<Personne>();
    		 listCategorie = new HashMap<String, Categorie>();
             inAnnuaire = true;
          }else if(qName.equals("personne")){
             personne = new Personne();// si on rencontre une balise personne, on crée un objet personne
             try{
             	int id = Integer.parseInt(attributes.getValue("id"));
                personne.setId(id);
             }catch(Exception e){
             	//erreur, le contenu de id n'est pas un entier
                throw new SAXException(e);
             }
             inPersonne = true;	
          }else if(qName.equals("nom")){
             inNom = true;	
          }else if(qName.equals("prenom")){
             inPrenom = true;	
          }else if(qName.equals("adresse")){
             inAdresse = true;	
    	  }else if (qName.equals("categorie")) {
    		 categorie = new Categorie(); //si on rencontre une balise categorie on crée un objet categorie
    		 inCategorie = true;
    	  }else if (qName.equals("cat1")) {
    		 inCat1 = true;
    	  }else if (qName.equals("cat2")) {
    		 inCat2 = true;
          }else{
             //erreur, on peut lever une exception
             throw new SAXException("Balise "+qName+" inconnue.");	
          }
       }
       //détection fin de balise
       public void endElement(String uri,
                           String localName,
                           String qName)
                    throws SAXException{
          if(qName.equals("annuaire")){
             inAnnuaire = false;
          }else if(qName.equals("personne")){
          	 annuaire.add(personne);
          	 personne = null;
             inPersonne = false;	
          }else if(qName.equals("nom")){
             inNom = false;	
          }else if(qName.equals("prenom")){
             inPrenom = false;	
          }else if(qName.equals("adresse")){
             inAdresse = false;	
          }else if(qName.equals("cat1")){
              inCat1 = false;	
          }else if(qName.equals("cat2")){
              inCat2 = false;	
          }else if (qName.equals("categorie")) {
                if(listCategorie.get(categorie.getLibelle())==null)
     
    		  {
    			  listCategorie.put(categorie.getLibelle(), categorie);
    			  personne.setCategorie(categorie);
    			  categorie = null;
    		  }else{
    			  Categorie categorieInList = listCategorie.get(categorie.getLibelle());
    			  personne.setCategorie(categorieInList);
    		  }
     
    			   inCategorie = false;
          }else{
             //erreur, on peut lever une exception
             throw new SAXException("Balise "+qName+" inconnue.");	
          }          	
       }
       //détection de caractères
       public void characters(char[] ch,
                           int start,
                           int length)
                    throws SAXException{
          String lecture = new String(ch,start,length);
          if(inNom){
             personne.setNom(lecture);	
          }else if(inPrenom){
             personne.setPrenom(lecture);	
          }else if(inAdresse){
             personne.setAdresse(lecture);	
          }else if (inCategorie){
        	 categorie.setLibelle(lecture);
        	 if (inCat1)
        		 categorie.setCat1(lecture);
        	 else if(inCat2)
        		 categorie.setCat2(lecture);	 
          }
       }
       //début du parsing
       public void startDocument() throws SAXException {
       	  System.out.println("Début du parsing");
       }
       //fin du parsing
       @SuppressWarnings("unchecked")
    public void endDocument() throws SAXException {
    	  System.out.println("Fin du parsing");
       	  System.out.println("Resultats du parsing");
     
       	  for (Iterator i = listCategorie.values().iterator(); i.hasNext();)
       	  {
           	  	Categorie cat = (Categorie)i.next() ;
            	System.out.println(cat.getLibelle());
       	  }
     
       	  for(Personne p : annuaire){
       		   System.out.println(p.getPrenom());
    		   System.out.println(p.getCategorie().getLibelle());
       	  }
       }
    }
    J'attends ton aide!!
    MErci

Discussions similaires

  1. [XSLT]XML vers XML avec des transformations de texte au passage
    Par samcsharpandco dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/11/2007, 17h15
  2. Réponses: 2
    Dernier message: 13/10/2007, 07h04
  3. Fabriquer un fichier XML avec des imbrications
    Par zooffy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/09/2007, 10h20
  4. Créer du xml avec des données Oracle
    Par Baumont dans le forum Oracle
    Réponses: 3
    Dernier message: 23/11/2005, 15h35

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