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 :

parsage xml sax probleme valeur null


Sujet :

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

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 215
    Par défaut parsage xml sax probleme valeur null
    Bonjour,

    Je veux parser ce 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
     
    <Specialites><specialite>
    <Id>96</Id>
    <Nom>Urologie</Nom>
     </specialite><specialite>
    <Id>39</Id>
    <Nom>Cardiologie</Nom>
    </specialite><specialite>
    ...
    ...
    </specialite><specialite>
    <Id>97</Id>
    <Nom>Virologie</Nom>
     </specialite></Specialites>
    Pour cela j'ai Une classe ComboContentHandler()

    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
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
    public class ComboContentHandler implements ContentHandler {
     
     
    	static String lastElement;
     
    	private Locator locator;
    	private ArrayList<String> tabId;
    	private ArrayList<String> tabString;
     
    	/**
             * Constructeur par defaut. 
             */
    	public ComboContentHandler() {
    		super();
    		// On definit le locator par defaut.
    		locator = new LocatorImpl();
    		tabId = new ArrayList();
    		tabString = new ArrayList();
     
     
    	}
     
    	/**
             * Definition du locator qui permet a tout moment pendant l'analyse, de localiser
             * le traitement dans le flux. Le locator par defaut indique, par exemple, le numero
             * de ligne et le numero de caractere sur la ligne.
             * @author smeric
             * @param value le locator a utiliser.
             * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator)
             */
    	public void setDocumentLocator(Locator value) {
    		locator =  value;
    	}
     
    	/**
             * Evenement envoye au demarrage du parse du flux xml.
             * @throws SAXException en cas de probleme quelquonque ne permettant pas de
             * se lancer dans l'analyse du document.
             * @see org.xml.sax.ContentHandler#startDocument()
             */
    	public void startDocument() throws SAXException {
    	}
     
    	/**
             * Evenement envoye a la fin de l'analyse du flux xml.
             * @throws SAXException en cas de probleme quelquonque ne permettant pas de
             * considerer l'analyse du document comme etant complete.
             * @see org.xml.sax.ContentHandler#endDocument()
             */
    	public void endDocument() throws SAXException {
     
    		for(int i=0;i<tabId.size();i++){
     
    			System.out.println(tabId.get(i));
    			System.out.println(tabString.get(i));
    		}
    	}
     
    	/**
             * Debut de traitement dans un espace de nommage.
             * @param prefixe utilise pour cet espace de nommage dans cette partie de l'arborescence.
             * @param URI de l'espace de nommage.
             * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String)
             */
    	public void startPrefixMapping(String prefix, String URI) throws SAXException {
    	}
     
    	/**
             * Fin de traitement de l'espace de nommage.
             * @param prefixe le prefixe choisi a l'ouverture du traitement de l'espace nommage.
             * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String)
             */
    	public void endPrefixMapping(String prefix) throws SAXException {
    	}
     
    	/**
             * Evenement recu a chaque fois que l'analyseur rencontre une balise xml ouvrante.
             * @param nameSpaceURI l'url de l'espace de nommage.
             * @param localName le nom local de la balise.
             * @param rawName nom de la balise en version 1.0 <code>nameSpaceURI + ":" + localName</code>
             * @throws SAXException si la balise ne correspond pas a ce qui est attendu,
             * comme par exemple non respect d'une dtd.
             * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
             */
    	public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs) throws SAXException {		
    		lastElement=rawName;
    		//System.out.println("last"+lastElement);
     
    	}
     
    	/**
             * Evenement recu a chaque fermeture de balise.
             * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
             */
    	public void endElement(String nameSpaceURI, String localName, String rawName) throws SAXException {
     
    	}
     
    	/**
             * Evenement recu a chaque fois que l'analyseur rencontre des caracteres (entre
             * deux balises).
             * @param ch les caracteres proprement dits.
             * @param start le rang du premier caractere a traiter effectivement.
             * @param end le rang du dernier caractere a traiter effectivement
             * @see org.xml.sax.ContentHandler#characters(char[], int, int)
             */
    	public void characters(char[] ch, int start, int end) throws SAXException {
     
    System.out.println("je rentre dans caractere");
    		 String Id=null;
    		 String Nom=null;
     
    			if(lastElement.equals("Id")) {
    				Id =new String(ch, start, end);
    				//System.out.println(Id);
    				tabId.add(Id);
     
    			}
     
     
    			if(lastElement.equals("Nom")) {
    				Nom =new String(ch, start, end);
    				//System.out.println(Nom);
    				tabString.add(Nom);
    			}
     
    			//System.out.println(Id);
    			//System.out.println(Nom);
    			}
     
         public ArrayList<String> gettabId(){
        	 return this.tabId;
         }
     
         public ArrayList<String> gettabNom(){
        	 return this.tabString;
         }
    	/**
             * Recu chaque fois que des caracteres d'espacement peuvent etre ignores au sens de
             * XML. C'est a dire que cet evenement est envoye pour plusieurs espaces se succedant,
             * les tabulations, et les retours chariot se succedants ainsi que toute combinaison de ces
             * trois types d'occurrence.
             * @param ch les caracteres proprement dits.
             * @param start le rang du premier caractere a traiter effectivement.
             * @param end le rang du dernier caractere a traiter effectivement
             * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int)
             */
    	public void ignorableWhitespace(char[] ch, int start, int end) throws SAXException {
     
    	}
     
    	/**
             * Rencontre une instruction de fonctionnement.
             * @param target la cible de l'instruction de fonctionnement.
             * @param data les valeurs associees a cette cible. En general, elle se presente sous la forme 
             * d'une serie de paires nom/valeur.
             * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String)
             */
    	public void processingInstruction(String target, String data) throws SAXException {
    	}
     
    	/**
             * Recu a chaque fois qu'une balise est evitee dans le traitement a cause d'un
             * probleme non bloque par le parser. Pour ma part je ne pense pas que vous
             * en ayez besoin dans vos traitements.
             * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String)
             */
    	public void skippedEntity(String arg0) throws SAXException {
    	}
     
     
     
    }
    Je récupère les valeurs dans des tableaux dans la methode characters() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	if(lastElement.equals("Id")) {
    				Id =new String(ch, start, end);
    				//System.out.println(Id);
    				tabId.add(Id);
     
    			}
     
     
    			if(lastElement.equals("Nom")) {
    				Nom =new String(ch, start, end);
    				//System.out.println(Nom);
    				tabString.add(Nom);
    			}
    Ceci marche sauf que à la fin les tableau ne font pas la meme taille et contiennent tout les deux aussi des valeurs null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    saxReader = new SAXParser();
    		sch = new ComboContentHandler();
    		saxReader.setContentHandler(sch);
    InputSource s = new InputSource(new StringReader(xml2)); 
    		saxReader.parse(s);
    Pourquoi ces valeurs null qui sont à l'origine de mon problème.

    Je reste à votre disposition pour plus d'informations

    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour toma03,

    Je déterre un vieux sujet mais as-tu trouvé la solution à ton problème ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je demande ça car j'ai le même problème.

    Mon Handler :
    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
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
     
    import model.CategoryBean;
    import model.QuestionBean;
    import model.QuestionsBean;
     
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
     
    public class ParserXMLHandler extends DefaultHandler {
     
    	// nom des tags XML
    	private final String MAIN_CATEGORY = "mainCategory";
    	private final String CATEGORY = "category";
    	private final String QUESTION_LIST = "questionList";
    	private final String QUESTION = "question";
     
    	// nom des attributs
    	private final String TITLE = "title";
    	private final String STATE = "state";
    	private final String ACTIVATED = "activated";
    	private final String COMMENT = "comment";
    	private final String VALUE = "value";
    	private final String PRIORITY = "priority";
    	private final String INT_VALUE = "intValue";
     
    	// Array list de Category
    	private CategoryBean mainCategory;
     
    	// Boolean permettant de savoir si nous sommes à l'intérieur d'un item
    	private boolean inMainCategory, inCategory, inQuestionList, inQuestion;
     
    	// mainCategory courante
    	private CategoryBean currentMainCategoryBean;
     
    	// Category courante
    	private CategoryBean currentCategoryBean;
     
    	// CategoryList courante
    	private List<CategoryBean> currentCategoryList;
     
    	// Questions courante
    	private CategoryBean currentQuestionsBean;
     
    	// Questions courante
    	private List<CategoryBean> currentQuestionsList;
     
    	// Question courante
    	private QuestionBean currentQuestion;
     
    	// Liste de question courante
    	private List<QuestionBean> currentQuestionList;
     
    	// Buffer permettant de contenir les données d'un tag XML
    	private StringBuilder buffer;
     
    	// LinkedList utilisée pour gérer la hiérarchie des balises
    	private LinkedList<Object> noeudList;
     
    	private CategoryBean result;
     
    	@Override
    	public void processingInstruction(String target, String data) throws SAXException {
    		super.processingInstruction(target, data);
    	}
     
    	public ParserXMLHandler() {
    		super();
    	}
     
    	// * Cette méthode est appelée par le parser une et une seule
    	// * fois au démarrage de l'analyse de votre flux xml.
    	// * Elle est appelée avant toutes les autres méthodes de l'interface,
    	// * à l'exception unique, évidemment, de la méthode setDocumentLocator.
    	// * Cet événement devrait vous permettre d'initialiser tout ce qui doit
    	// * l'être avant ledébut du parcours du document.
     
    	@Override
    	public void startDocument() throws SAXException {
    		super.startDocument();
    		noeudList = new LinkedList<Object>();
     
    		currentCategoryList = new ArrayList<CategoryBean>();
    		currentQuestionList = new ArrayList<QuestionBean>();
    		currentQuestionsList = new ArrayList<CategoryBean>();
    		mainCategory = new CategoryBean();
    	}
     
    	/*
    	 * Fonction étant déclenchée lorsque le parser trouve un tag XML C'est cette méthode que nous allons utiliser pour instancier une
    	 * nouvelle category
    	 */
    	@Override
    	public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
    		// Nous réinitialisons le buffer a chaque fois qu'il rencontre un item
    		buffer = new StringBuilder();
     
    		// Ci dessous, localName contient le nom du tag rencontré
     
    		if (name.equalsIgnoreCase(MAIN_CATEGORY)) {
    			currentMainCategoryBean = new CategoryBean();
    			currentCategoryList = new ArrayList<CategoryBean>();
    			currentMainCategoryBean.setActivated(parseInt(attributes.getValue(ACTIVATED)));
    			currentMainCategoryBean.setCategoryList(currentCategoryList);
    			currentMainCategoryBean.setState(parseInt(attributes.getValue(STATE)));
    			currentMainCategoryBean.setTitle(attributes.getValue(TITLE));
     
    			noeudList.add(currentMainCategoryBean);
     
    			inMainCategory = true;
    		} else if (name.equalsIgnoreCase(CATEGORY)) {
    			currentCategoryBean = new CategoryBean();
    			currentCategoryList = new ArrayList<CategoryBean>();
    			currentCategoryBean.setActivated(parseInt(attributes.getValue(ACTIVATED)));
    			currentCategoryBean.setCategoryList(currentCategoryList);
    			currentCategoryBean.setState(parseInt(attributes.getValue(STATE)));
    			currentCategoryBean.setTitle(attributes.getValue(TITLE));
     
    			noeudList.add(currentCategoryBean);
     
    			inCategory = true;
    		} else if (name.equalsIgnoreCase(QUESTION_LIST)) {
    			currentQuestionsBean = new QuestionsBean();
    			currentQuestionList = new ArrayList<QuestionBean>();
    			((QuestionsBean) currentQuestionsBean).setComment(attributes.getValue(COMMENT));
    			((QuestionsBean) currentQuestionsBean).setQuestionList(currentQuestionList);
     
    			noeudList.add(currentQuestionsBean);
     
    			inQuestionList = true;
    		} else if (name.equalsIgnoreCase(QUESTION)) {
    			currentQuestion = new QuestionBean();
    			currentQuestion.setActivated(parseInt(attributes.getValue(ACTIVATED)));
    			currentQuestion.setComment(attributes.getValue(COMMENT));
    			currentQuestion.setIntValue(parseInt(attributes.getValue(INT_VALUE)));
    			currentQuestion.setPriority(parseInt(attributes.getValue(PRIORITY)));
    			currentQuestion.setValue(parseInt(attributes.getValue(VALUE)));
     
    			noeudList.add(currentQuestion);
     
    			inQuestion = true;
    		}
    	}
     
    	// * Fonction étant déclenchée lorsque le parser à parsé
    	// * l'intérieur de la balise XML La méthode characters
    	// * a donc fait son ouvrage et tous les caractère inclus
    	// * dans la balise en cours sont copiés dans le buffer
    	// * On peut donc tranquillement les récupérer pour compléter
    	// * notre objet currentFeed
     
    	@Override
    	public void endElement(String uri, String localName, String name) throws SAXException {
     
    		if (name.equalsIgnoreCase(QUESTION)) {
    			if (inQuestion) {
    				currentQuestion.setQuestion(buffer.toString());
    				currentQuestionList.add(currentQuestion);
     
    				buffer = null;
    				currentQuestion = null;
     
    				inQuestion = false;
    			}
    		} else if (name.equalsIgnoreCase(QUESTION_LIST)) {
    			if (inQuestionList) {
    				((QuestionsBean) currentQuestionsBean).setQuestionList(currentQuestionList);
    				currentQuestionsList.add(currentQuestionsBean);
     
    				currentQuestionsBean = null;
    				currentQuestionList = new ArrayList<QuestionBean>();
     
    				inQuestionList = false;
    			}
    		} else if (name.equalsIgnoreCase(CATEGORY)) {
    			if (inCategory) {
    				currentCategoryBean.setCategoryList(currentQuestionsList);
    				currentCategoryList.add(currentCategoryBean);
     
    				currentCategoryBean = null;
    				currentQuestionsList = new ArrayList<CategoryBean>();
     
    				inCategory = false;
    			}
    		} else if (name.equalsIgnoreCase(MAIN_CATEGORY)) {
    			mainCategory.setCategoryList(currentCategoryList);
     
    			// inMainCategory = false;
    		}
    	}
     
    	// * Tout ce qui est dans l'arborescence mais n'est pas partie
    	// * intégrante d'un tag, déclenche la levée de cet événement.
    	// * En général, cet événement est donc levé tout simplement
    	// * par la présence de texte entre la balise d'ouverture et
    	// * la balise de fermeture
     
    	public void characters(char[] ch, int start, int length) throws SAXException {
    		String lecture = new String(ch, start, length);
    		if (buffer != null)
    			buffer.append(lecture);
    	}
     
    	// cette méthode nous permettra de récupérer les données
    	public CategoryBean getDatas() {
    		return result;
    	}
     
    	private Integer parseInt(String stringToParse) {
    		if (stringToParse != null && !stringToParse.equals("")) {
    			return Integer.parseInt(stringToParse);
    		} else {
    			return null;
    		}
    	}
     
    	public void endDocument() throws SAXException {
    		try {
    			result = mainCategory.clone();
    		} catch (CloneNotSupportedException e) {
    			e.printStackTrace();
    		}
    		System.out.println(mainCategory);
    		System.out.println(result);
    	}
    }
    Lorsque j'arrive à endDocument(), mon mainCategory est bien rempli. Les 2 sysout marche bien.

    Par contre lorsque j'appelle le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public CategoryBean getDatas() {
        return result;
    }
    Là j'ai une valeur nulle alors qu'à aucun moment je ne set cette référence à NULL ...

    Une idée ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon j'ai rien dis c'est dans mon main que j'ai fait une erreur ...

Discussions similaires

  1. Probleme valeur NULL
    Par axe31 dans le forum Requêtes
    Réponses: 0
    Dernier message: 01/04/2013, 22h23
  2. [C#] Probleme de lecture de valeur nulle
    Par kenzo080 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 25/10/2010, 16h58
  3. <sequence>valuetype probleme valeur null
    Par volcon dans le forum CORBA
    Réponses: 4
    Dernier message: 16/06/2010, 18h51
  4. [CR 10] Probleme valeur NULL
    Par exile69 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/11/2009, 08h55
  5. [SAX] Parsage xml sax
    Par toma03 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 18/06/2009, 17h00

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