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