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 :

Problème de parsing ? [SAX]


Sujet :

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

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut Problème de parsing ?
    Bonjour à tous,

    j'utilise un parser SAX sur un disque réseau qui parse un fichier XML lui aussi sur le disque réseau.

    Par intermittence et sans réelle raison apparente, de temps en temps certaines données (String) sont "mangée" en partie.
    Exemple:
    String données = "Regis";
    Donnée parsée : "gis" (il m'a donc coupé le début du mot)

    Avez-vous déjà eu ce genre de problème ?

    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
     
    /**Methode principale qui crée le parser SAX avec le fichier à analyser*/
    	public void analyse(File file) 
    	{
     
     
    		try {
     
    			SAXParserFactory factory = SAXParserFactory.newInstance();
    			factory.setValidating(false);
    			try {
     
    				SAXParser saxParser = factory.newSAXParser();
    				//construction d'un parser SAX
     
     
    				saxParser.parse(file, this);
     
    				} 
    			catch (ParserConfigurationException e2) {
    				System.out.println("Parser.erreur1");
    				e2.printStackTrace();
     
    				} 
    			catch (SAXException e2) {
    				System.out.println("Parser.erreur2");
    				e2.printStackTrace();
     
    				} 
    			catch (IOException e) {
    				System.out.println("===================================");
    				System.out.println("             ERREUR !              ");
    				System.out.println("Problème de localisation de fichier du QuickParser !");
     
    				//e.printStackTrace();
     
    				}
    			} 
    		catch (Exception e) {
    			System.out.println("erreur4");
    			System.out.println(e.toString());
    			}
     
    	}
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 304
    Points : 348
    Points
    348
    Par défaut
    La création du parseur a l'air correcte. Fais voir le code pour parser le XML.
    --Miss Gaëlle--

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 59
    Points : 50
    Points
    50
    Par défaut
    Perso, je passe par XMLReader et par l'implémentation d'un gestionnaire de contenu ContentHandler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String uriXMLFile = ...; 
    // ... le chemin vers ton fichier XML à traiter
    // Il serait intéressant de jeter un coup d'oeil aux ID System
     
    MyContentHandler h = new MyContentHandler(...);
    // Mon gestionnaire de contenu (qui implémente ContentHandler)
    // ... représentants des paramètres ou non suivant le gestionnaire
     
    XMLReader saxReader = XMLReaderFactory.createXMLReader();
    saxReader.setContentHandler(h);
    saxReader.parse(uriXMLFile);
    Le tout entouré d'un try/catch pour les exceptions SAXException, IOException & ParserConfigurationException

    Ensuite, ben on demande au gestionnaire de contenu de renvoyer la collection ou les collections d'objets Java correspondants à l'aide d'une méthode qu'on a écrit sois-même : des simples "get" : return myCollection; par exemple

    Faudrait voir le code de ton gestionnaire de contenu.

  4. #4
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Voici le code de la classe complete du parser:

    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
     
    public class QuickParser extends DefaultHandler 
    {
    	/**Objet représentant l'élement courant de début analysé*/
    	private String elementCourant = "";
     
    	/**Objet représentant l'élement courant de fin analysé*/
    	private String elementFin = "";
     
    	public static String maj;//String représentant le Long de System.currentTimeMillis() à l'enregistrement du fichier
     
     
    	/**Constructeur*/
    	public QuickParser() //constructeur par défaut
    	{
    		maj = "";
    	} 
     
    	/**Méthode effectuant des instructions dès la rencontre d'un élément de début (balise XML)*/
    	public void startElement(
    		String uri,
    		String localName,
    		String qName,
    		Attributes attributes)
    		throws SAXException 
    		{
     
     
    		elementCourant = qName;
     
     
     
     
     
    	} //fin de la méthode 
     
    	/**Méthode effectuant des instructions dès la rencontre d'un élément de fin (balise XML)*/
    	public void endElement(
    		java.lang.String uri,
    		java.lang.String localName,
    		java.lang.String qName)
    		throws SAXException {
     
    	elementFin = qName;
    	elementCourant = "";//On réinitialise l'element courant (balise début) quand on sort d'une balise
     
     
     
     
     
    	}
     
    	public void characters(char[] ch, int start, int length)//Object Interger ?
    		throws SAXException 
     
    	{
     
     
    		if (elementCourant.equals("ID"))
    		{
    			maj = new String(ch, start, length);
    		}		
     
     
    		if (elementCourant.equals("MPA"))
    		{
    			String mpa = new String(ch, start, length);
    			SessionAdmin.setMotPasseAdmin(mpa);
    		}		
     
    		if (elementCourant.equals("IPSERVADDRESS"))
    		{
    			String ip = new String(ch, start, length);
    			SendMail.setServeurIPaddress(ip);
    		}		
     
     
    		if (elementCourant.equals("FORMAIL1"))
    		{
    			String emailR = new String(ch, start, length);
    			SendMail.setRecepteur1AdressMail(emailR);
    		}		
     
    		if (elementCourant.equals("FORMAIL2"))
    		{
    			String emailR = new String(ch, start, length);
    			SendMail.setRecepteur2AdressMail(emailR);
    		}		
     
    		if (elementCourant.equals("FROMMAIL"))
    		{
    			String emailE = new String(ch, start, length);
    			SendMail.setEmetteurAdressMail(emailE);
    		}		
     
     
     
     
    	}
     
    	/**Methode principale qui crée le parser SAX avec le fichier à analyser*/
    	public void analyse(File file) 
    	{
     
     
    		try {
     
    			SAXParserFactory factory = SAXParserFactory.newInstance();
    			factory.setValidating(false);
    			try {
     
    				SAXParser saxParser = factory.newSAXParser();
    				//construction d'un parser SAX
     
     
    				saxParser.parse(file, this);
     
    				} 
    			catch (ParserConfigurationException e2) {
    				System.out.println("Parser.erreur1");
    				e2.printStackTrace();
     
    				} 
    			catch (SAXException e2) {
    				System.out.println("Parser.erreur2");
    				e2.printStackTrace();
     
    				} 
    			catch (IOException e) {
    				System.out.println("===================================");
    				System.out.println("             ERREUR !              ");
    				System.out.println("Problème de localisation de fichier du QuickParser !");
     
    				//e.printStackTrace();
     
    				}
    			} 
    		catch (Exception e) {
    			System.out.println("erreur4");
    			System.out.println(e.toString());
    			}
     
    	}
     
     
     
    } //fin de la classe QuickParser
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    J'ai déja eu ce genre de probleme et j'ai trouvé une solution .
    En fait il faudrait que tu récupères tes valeurs dans la méthode endElement plutot que dans characters. Ca ferait un code du genre :
    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
     
     
     
       /**Méthode effectuant des instructions dès la rencontre d'un élément de fin (balise XML)*/ 
       public void endElement( 
          java.lang.String uri, 
          java.lang.String localName, 
          java.lang.String qName) 
          throws SAXException { 
     
     if (elementCourant.equals("ID")) 
          { 
             maj = elementEnCours;
             elementEnCours="";
     
          }       
     
     
          if (elementCourant.equals("MPA")) 
          { 
             String mpa =elementEnCours;
             elementEnCours="";
             SessionAdmin.setMotPasseAdmin(mpa); 
          }       
     
          if (elementCourant.equals("IPSERVADDRESS")) 
          { 
             String ip = elementEnCours;
             elementEnCours="";
             SendMail.setServeurIPaddress(ip); 
          }       
     
     
          if (elementCourant.equals("FORMAIL1")) 
          { 
             String emailR = elementEnCours;
             elementEnCours="";
             SendMail.setRecepteur1AdressMail(emailR); 
          }       
     
          if (elementCourant.equals("FORMAIL2")) 
          { 
             String emailR = elementEnCours;
             elementEnCours="";
             SendMail.setRecepteur2AdressMail(emailR); 
          }       
     
          if (elementCourant.equals("FROMMAIL")) 
          { 
             String emailE = elementEnCours;
             elementEnCours="";
             SendMail.setEmetteurAdressMail(emailE); 
          }       
     
       elementFin = qName; 
       elementCourant = "";//On réinitialise l'element courant (balise début) quand on sort d'une balise 
     
      } 
     
       public void characters(char[] ch, int start, int length)//Object Interger ? 
          throws SAXException 
           elementEnCours+=new String(ch, start, length); 
       {

  6. #6
    Membre confirmé

    Inscrit en
    Juillet 2002
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 116
    Points : 514
    Points
    514
    Par défaut
    Cela vient du fait que tu considére que la méthode characters() n'est pas appelé qu'une fois entre un startElement et un endElement() ...
    Ce qui n'est pas toujours le cas ...
    Le nombre de fois que la méthode characters() est appelé dépends du buffer de l'implémentation de SAX, ce qui donne lieu à un effet aléatoire ...

    Ainsi parfois nous avons les appels :
    startElement()
    characters()
    endElement()
    et d'autres fois, nous avons :
    startElement()
    characters()
    characters()
    endElement()

    Voici le code que je te propose pour remédier à ce probléme ( je n'ai pas eu le temps de le tester ) :
    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
     
    public String maj=null;
    public StringBuffer contenu=null;
     
    public void startElement( String uri, String localName, String qName, Attributes attributes) throws SAXException 
    { 
       if (qName.equals("ID") || qName.equals("MPA") || qName.equals("IPSERVADDRESS") || qName.equals("FORMAIL1") || qName.equals("FORMAIL2") || qName.equals("FROMMAIL")) contenu=new StringBuffer();
       else contenu=null;
    }
     
    public void endElement( java.lang.String uri, java.lang.String localName, java.lang.String qName) throws SAXException
    {
       if(contenu!=null)
       {
          if (qName.equals("ID") ) maj = contenu.toString(); 
          else if (qName.equals("MPA")) SessionAdmin.setMotPasseAdmin(contenu.toString()); 
          else if (qName.equals("IPSERVADDRESS")) SendMail.setServeurIPaddress(contenu.toString()); 
          else if (qName.equals("FORMAIL1")) SendMail.setRecepteur1AdressMail(contenu.toString()); 
          else if (qName.equals("FORMAIL2")) SendMail.setRecepteur2AdressMail(contenu.toString()); 
          else if (elementCourant.equals("FROMMAIL")) SendMail.setEmetteurAdressMail(contenu.toString()); 
       }
    } 
     
    public void characters(char[] ch, int start, int length) throws SAXException 
    {
       if(contenu!=null) contenu.append(new String(ch,start,length));
    }

  7. #7
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Merci à tous pour votre aide.
    Il faudra que je test ça et je vous tient au courant.
    Je suis déjà super content de ne pas être le seul à avoir rencontré ce problème en tout cas, car mon appli est déjà installée et j'étais dans les choux!
    J'espère que cela va résoudre mon problème car de temps en temps j'ai des données qui se retrouvent perdues, et ça ne fait pas trop sérieux...
    LOOOL <=== rire jaune
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  8. #8
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    J'ai implémenté, pour l'instant ça à l'air de marcher correctement.
    Affaire à suivre sur le long terme...

    Merci en tout cas à ceux qui m'ont aidé, en particulier Debernad dont la réponse me parait bien plus adaptée au problème que j'ai rencontré, mais aussi aux autres intervenants.

    Je ne mets pas encore le tag résolu pour l'instant car je vais attendre un peu pour voir si le problème est définitivement reglé.
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  9. #9
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Au regard des jours qui passent et qui se ressemblent, je pense que jepeux mettre le tag resolu puisque tout à l'air de bien fonctionner avec cette implémentation.

    Merci à tous pour votre coup de main.

    Régis.
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Problème de parsing avec DomParser
    Par iam_free dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 21/04/2006, 09h33
  2. Problème de parse étrange
    Par Jim_Nastiq dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2006, 13h39
  3. [DOM] [DocumentBuilder] Problème de parsing de fichier
    Par tck-lt dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 13/04/2006, 17h18
  4. [Tableaux] problème de parse error
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 06/04/2006, 21h37
  5. [JDOM] Problème de Parsing JDOM
    Par RapidJul dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 06/10/2005, 12h09

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