Bonjour,
Mon appli comporte des fichiers XML de configuration.
Quelle serait le moyen le plus simple pour parcourir l'arborescence ? Est-il judicieux d'utiliser des fichiers XSD afin d'automatiser le plus possible ?
Merci.
Bonjour,
Mon appli comporte des fichiers XML de configuration.
Quelle serait le moyen le plus simple pour parcourir l'arborescence ? Est-il judicieux d'utiliser des fichiers XSD afin d'automatiser le plus possible ?
Merci.
un Schema XSD ne sert qu'a la validation du XML.
Pour lire le XML il faut utiliser soit JDOM/SAX ou une api comme commons digester ou XStream.
Je crois que la classe properties peut aussi prendre un fichier XML.
Ci-joint ma fonction qui lit mon fichier XML :
Y-a-t-il un moyen plus simple pour lire ce fichier 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
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 private void lireGrilleSudoku() throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); File fichier = new File(this.emplacmtGrilleSudoku); Document doc = builder.parse(fichier); // Recupere le permier element du fichier de parametres Element elem1 = doc.getDocumentElement(); // recupere les elements suivants du fichier de parametres // si le premier élément est sudoku ! if (elem1.getTagName().equals("sudoku")) { NodeList listeElem1 = elem1.getChildNodes(); for (int i=0; i<listeElem1.getLength(); i++) { Node NodeElem2 = listeElem1.item(i); if (NodeElem2 instanceof Element) { Element elem2 = (Element) NodeElem2; // Récupère les éléments suivants seulement, et seulement si l'élément courant est "grille" if (elem2.getTagName().equals("grille")) { NodeList listeElem2 = elem2.getChildNodes(); for (int k=0; k<listeElem2.getLength(); k++) { Node NodeElem3 = listeElem2.item(k); if (NodeElem3 instanceof Element) { Element elem3 = (Element) NodeElem3; //System.out.println(elem3.getTagName()); //if (elem3.getTagName().equals("ligne1")) //{ if (elem3.getTagName().equals("ligne1")) { NodeList listeElem3 = elem3.getChildNodes(); for (int l=0; l<listeElem3.getLength(); l++) { Node NodeElem4 = listeElem3.item(l); if (NodeElem4 instanceof Element) { Element elem4 = (Element) NodeElem4; //System.out.println(elem4.getChildNodes()); if (elem4.getChildNodes().equals("colonne1")) { System.out.println(elem4.getChildNodes()); } } } //if (elem3.getTagName().equals("colonne")) //{ //this.port = Integer.parseInt(paramElem.getFirstChild().toString()); //} } //} if (elem3.getTagName().equals("ligne2")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne3")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne4")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne5")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne6")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne7")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne8")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne9")) { //this.adresse = paramElem.getFirstChild().toString(); } } } } } } } }
Avec ce code, si je rajoute un mot clé dans l'arborescence, le programme ne pleut plus tourner !
merci !
Si tu définis un XSD, tu peux aussi te tourner vers JAXB.
Ci-joint ma fonction qui lit mon fichier XML :Envoyé par Ricky81
Code :
Y-a-t-il un moyen plus simple pour lire ce fichier XML ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 private void lireGrilleSudoku() throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); File fichier = new File(this.emplacmtGrilleSudoku); Document doc = builder.parse(fichier); // Recupere le permier element du fichier de parametres Element elem1 = doc.getDocumentElement(); // recupere les elements suivants du fichier de parametres // si le premier élément est sudoku ! if (elem1.getTagName().equals("sudoku")) { NodeList listeElem1 = elem1.getChildNodes(); for (int i=0; i<listeElem1.getLength(); i++) { Node NodeElem2 = listeElem1.item(i); if (NodeElem2 instanceof Element) { Element elem2 = (Element) NodeElem2; // Récupère les éléments suivants seulement, et seulement si l'élément courant est "grille" if (elem2.getTagName().equals("grille")) { NodeList listeElem2 = elem2.getChildNodes(); for (int k=0; k<listeElem2.getLength(); k++) { Node NodeElem3 = listeElem2.item(k); if (NodeElem3 instanceof Element) { Element elem3 = (Element) NodeElem3; //System.out.println(elem3.getTagName()); //if (elem3.getTagName().equals("ligne1")) //{ if (elem3.getTagName().equals("ligne1")) { NodeList listeElem3 = elem3.getChildNodes(); for (int l=0; l<listeElem3.getLength(); l++) { Node NodeElem4 = listeElem3.item(l); if (NodeElem4 instanceof Element) { Element elem4 = (Element) NodeElem4; //System.out.println(elem4.getChildNodes()); if (elem4.getChildNodes().equals("colonne1")) { System.out.println(elem4.getChildNodes()); } } } //if (elem3.getTagName().equals("colonne")) //{ //this.port = Integer.parseInt(paramElem.getFirstChild().toString()); //} } //} if (elem3.getTagName().equals("ligne2")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne3")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne4")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne5")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne6")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne7")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne8")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne9")) { //this.adresse = paramElem.getFirstChild().toString(); } } } } } } } }
Avec ce code, si je rajoute un mot clé dans l'arborescence, le programme ne pleut plus tourner !
merci !
perso j'utilise pas mal DOM, et un truc efficace à mon gout pour avoir une structure claire est d'utiliser la recursivité :
Avec ca, il te suffit de rajouter un if de traitement dans afficherNoeud pour prendre en compte un nouveau fichier XML et enrichir le if sur parcoursFichierXML pour prendre en compte un nouveau ELEMENT qui possederait des fils
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 /** Fonction pour lancer le parse du fichier */ private void parcoursXML(String fichier) { DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); fabrique.setValidating(false); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); Document document = constructeur.parse( new File(fichier) ); //on recupere la racine du document NodeList config = document.getChildNodes(); //on lance le parcours du document a partir de sa racine parcoursFichierXML(config); } /** Cette fonction ne fait que demander de traiter les fils d'un noeud */ private void parcoursFichierXML(NodeList fichierDOM) { for(int i=0; i < fichierDOM.getLength(); i++) { afficherNoeud(fichierDOM.item(i)); } } /** Cette fonction permet de traiter le noeud : Afficher ses attributs methodes * et demander de traiter ses fils */ private void afficherNoeud(Node noeud) { // Si le noed est un element et s'il n'est pas l'element racine // Alors on le traite if(noeud.getNodeType() == Element.ELEMENT_NODE) { //System.out.println("Type "+noeud.getNodeType()); //System.out.println("Nom "+noeud.getNodeName()); //System.out.println("Value "+noeud.getNodeValue()); //System.out.println("Taille :"+noeud.getChildNodes().item(0).toString()); Text txt0 = (Text)noeud.getChildNodes().item(0); System.out.println("DATA "+txt0.getData() ); if(noeud.getNodeName().equals("SOUS_RACINE")) { //traitement sur ton nom } //Si le noeud possede des fils //qui nous interesse et que l'on va donc vouloir traiter if( noeud.getNodeName().equals("RACINE") ) parcoursFichierXML(noeud.getChildNodes()); } }
En esperant que cela t'aide
Bonjour
Pour le parsing de fichier XML, SAX est plus souple que DOM. Si tu ne fais pas de validation et que tu ne programmes pas comme un porc, les modifications mineures (ça peut aller jusqu'à l'ajout de balise) sur ton XSD n'impacterons pas ton programme.
Vu ton parsing, je pense que SAX est plus approprié que DOM.
yann
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager