Bonjour,
Comme vous avez remarqué, j'ai fait délesté mon précédent tread car il comportais trop de changement :oops:
C'est maintenant fixé, je fais une classe qui va me simplifié le travail. J'ai même d'ailleurs réussi à la faire fonctionné partiellement.
Pourquoi dis-je partiellement ?
Et bien tout simplement par ce que je me suis rend compte que la partie nouveauNoeud est censé ajouter un nœud dans la mémoire avant de passé le tout à une variable interne qui elle est usité dans la méthode de flux createXML.
Il se trouve qu'en essayant d'ajouter un nouveau nœud, j'écrase le précédent et du coup, je me retrouve avec la dernière valeur saisie. C'est du moins la constatation que j'ai faite avec des tests d'écriture.
Ce que j'aimerais faire si je puis me permettre, c'est de gratté un peu sur ce sujet afin de résoudre ce défaut pour que la classe écrive bien l'intégralité de l'arbre en sortie (attention, c'est un flux) mais aussi de permettre l'utilisation de nouveauNoeud en ajoutant bien, soit un parent seul, soit un parent avec un enfant, soit un parent, contenant le parent d'un enfant. Ce qui reviens à ces trois cas ci-dessous:
Code:
1
2
3 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <parent></parent>
Code:
1
2
3 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <parent><enfant /></parent>
Je ne met volontairement pas de donnéw dans les balise de façon d'abord à réglé le problème de mémoire / flux. Petit exemple de donnée dans une balise :Code:
1
2
3 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <parent1><parent2><enfant /></parent2></parent1>
Enfin, par ce que c'est la première chose que tout le monde veux voir ou savoir, c'est comment est fait ma classe. Pas de souci, voila la section qui nous intéresse.Code:<option nom="toto" />
Je ne met volontairement pas le main, car tout le monde aura compris que je fait appel à ma classe et que dans le constructeur je lui send une url du type "fichier.xml". La fonction createPath est là pour le cas ou je veux créer un répertoire précis, s'il n'existe pas (tester depuis le main au travers de la classe et exécute sa création depuis la classe). Pas de quoi y réfléchir, ça fonctionne très bien :ccool:Code:
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 package jXml; import java.io.File; import java.io.FileWriter; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.TransformerFactory; import javax.xml.transform.Transformer; import javax.xml.transform.OutputKeys; import javax.xml.transform.stream.StreamResult; /** * Cette classe à été prévue pour gérer des fichier XML. * Elle s'appuie sur DOM pour l'écriture des documents. * Elle s'appuie sur SAX pour le parcours et la lecture des documents. * @author Geeks * @version 1.0.0 */ public class GestionXml { /** * Champs de la classe GestionXml */ private final String pathFichier; private Document documentXML; /** * Constructeur * @param urlFichier */ public GestionXml(String urlFichier) { this.pathFichier = urlFichier; } /** * Créer un chemin */ public void createPath() { /* * Crée le répertoire */ //Extrait le chemin du répertoire en fonction du contenu d'rulFichier String newPath = pathFichier.substring(0, pathFichier.lastIndexOf('/')); //Crée une instance de File() pour ce chemin File file = new File(newPath); //Crée physiquement le chemin file.mkdir(); } /** * Ajoute un nouveau noeud à l'arbre XML * @param nom * @param parent */ public void newNode(String nom, Element parent) { try { DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); Document document = constructeur.newDocument(); Element noeud = document.createElement(nom); if(parent == null) { document.appendChild(noeud); } else { parent.appendChild(noeud); } documentXML = document; } catch (Exception e) { e.printStackTrace(); } } /** * Crée un fichier avec le flux de sortie de dom */ public void createXml() { try { DOMSource domSource = new DOMSource(documentXML); TransformerFactory tFactory = TransformerFactory.newInstance(); FileWriter out = new FileWriter(pathFichier); Transformer transformer = tFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.transform(domSource, new StreamResult(out)); } catch (Exception e) { e.printStackTrace(); } } }
Maintenant, je m'en remet à vos lumières pour le souci de perte de l'arbre et la construction d'un nouvel arbre qui me bloque et m'empêche maintenant d'avancer plus loin.
Merci pour les explications donnés par le passé et celles qui vont suivre. :ccool: