Bonjour tout le monde,

Un petit problème m’empêche de terminer mon projet.

Je dois parcourir un fichier XML, j’ai découvert JDOM (j’utilise la version 2.0.6) il y a quelques heures et j’aimerais savoir comment le faire fonctionner. J’ai vu l’existence d’un tutoriel. Utile ce tutoriel :) mais l’architecture de mon fichier XML, n’est pas la même, j’ai donc du mal à reproduire la méthode.

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
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<sites>
	<site id="bl" name="bl.com">
		<countries>
			<country id="fr">
				<servers>
					<server name="1.bl.p1.ci" />
					<server name="2.bl.p1.ci" />
					<server name="3.bl.p1.ci" />
				</servers>
			</country>
		</countries>
	</site>
 
	<site id="ca" name="ca">
		<countries>
			<country id="fr">
				<servers>
					<server name="7.bl.p1.ci" />
					<server name="8.bl.p1.ci" />
					<server name="9.bl.p1.ci" />
				</servers>
			</country>
			<country id="de">
				<servers>
					<server name="4.bl.p1.ci" />
					<server name="5.bl.p1.ci" />
					<server name="6.bl.p1.ci" />
				</servers>
			</country>
		</countries>
	</site>
</sites>

et mon code JAVA

Code JAVA : 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
public void TestXmlReader(){
		SAXBuilder builder = new SAXBuilder();
		File xmlFile = new File("/home/user/workspace/search-lms/lms-superpom/lms-admin/src/main/resources/lms-admin.xml");
 
		try {
 
			Document document = (Document) builder.build(xmlFile);
			Element rootNode = document.getRootElement();
			List<Element> list = rootNode.getChildren("site");
 
			Iterator<Element> i = list.iterator();
			while(i.hasNext()){
				Element current = (Element)i.next();
 
				System.out.println(current.getAttributeValue("id"));
                                System.out.println(current.getChild("countries").getAttributeValue("id"));
                                System.out.println(current.getChild("countries").getChild("country").getAttributeValue("id"));
                                System.out.println(current.getChild("countries").getChild("country").getChild("servers").getChild("server").getAttributeValue("name"));
			}
 
		  } catch (IOException io) {
			System.out.println(io.getMessage());
		  } catch (JDOMException jdomex) {
			System.out.println(jdomex.getMessage());
 
		  }

J’ai plus ou moins réussi à afficher un résultat, en faisant ce truc archi-dégeu, mais j’obtiens : « bl null fr 1.bl.p1.ci ca null fr 7.bl.p1.ci ». Je ne vois pas le « de », ni les autres noms des serveurs :(

Dois-je déclarer un autre Iterator sur une liste qui prendrait comme racine « country » ?

Dans ce genre là (ne fonctionne pas):

Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
List<Element> list2 = rootNode.getChildren("country");
Iterator<Element> j = list2.iterator();
 
while(i.hasNext()){
    while(j.hasNext()){
	Element current2 = (Element)j.next();
 
	System.out.println(current2.getAttributeValue("id"));
	System.out.println(current2.getChild("servers").getChild("server").getAttributeValue("name"));
    }
			}

Autrement, je suis en train de lire la documentation suivante (en anglais), on va voir si elle peut m’être utile.

Avez-vous une idée de comment faire ça mieux (et que ça fonctionne ^^') ?