Bonjour à tous et merci par avance pour votre attention.
Je suis actuellement en train de faire un logiciel en Java qui me permet, à partir de données récupérées et stockées dans des listes, de créer plusieurs fichiers XML. J'avais auparavant adopté une solution qui consistait a générer le XML global puis, lors de l'enregistrement, d'enlever des éléments selon leur nom... ce qui n'est pas si mal mais qui posait quelques problèmes, comme le fait que le filtrage soit codé en dur, et que si jamais certaines données n'étaient pas récupérées mais attendues, cela faisait planter l'exécution.
Je travaille alors sur une solution consistant à trier dès la création de l'arbre, afin de générer directement les différents fichiers XML sans passer par un fichier global. Je rencontre cependant des problèmes.
Mon problème est le suivant : dans un de mes arbres, j'ai un élément (complex, ayant des fils) de nom Protocol, que je ne dois pas ajouter au fichier. Un autre élément (complex) de nom General, se trouvant au même niveau que Protocol, contient un élément (simple type, sans fils) de nom Protocol, et je dois garder cet élément. Or, lors de l'exécution, soit mon programme supprime les deux, soit il garde les deux (soit il plante et me met une erreur sans message d'erreur).
Voici mon code qui supprime tous les éléments de nom Protocol :
mes deux conditions if sont la source de mes embêtements (un des deux ne sert que pour le test d'ailleurs). L'idée est de tester si l'élément de nom Protocol possède des fils : si oui, on enlève cet élément, sinon on le garde. Or lorsque je teste l'existence de fils (getChildren().size ou getChildren().isEmpty() ) le programme part dans les choux...
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 private void generateXMLPart1() { logger.info("Génération du fichier XML..."); for (XLSElement xlsElement : this.xlsElement) { String[] splitedPath = xlsElement.path.split(XLSDefine.SPLIT_SEPARATOR); Element currentElement = this.rootDOMPart1; for (int j = 0; j < splitedPath.length; j++) { if ((((splitedPath[j].contains(XML_PROTOCOL)) == true) && ((currentElement.getChildren().size() > 1) == true)) || ((splitedPath[j].contains(XML_DATAPOINT)) == true)) { break; } if (((splitedPath[j].contains(XML_PROTOCOL)) && !(currentElement.getChild( splitedPath[j]).getChildren().isEmpty()))) { logger.debug("entré"); } else if ((((splitedPath[j].contains(XLSDefine.EXCLUDE_TOKEN)) == false) && ((splitedPath[j] .isEmpty()) == false))) { logger.debug(currentElement.getName() + " contient : " + currentElement.getChildren().toString()); if ((isIncludedInDOM(currentElement.getChildren(), splitedPath[j])) == true) { currentElement = currentElement.getChild(splitedPath[j]); } else { Element child = new Element(splitedPath[j]); logger.debug("On ajoute " + child + " à " + currentElement); currentElement.addContent(child); if ((splitedPath[j - 1].equalsIgnoreCase(XML_SLAVE)) == true) { Attribute id = new Attribute(XML_ID, XLSDefine.EXCLUDE_TOKEN); Attribute modbusaddr = new Attribute(XML_MODBUSADDR, ""); child.setAttribute(id); child.setAttribute(modbusaddr); } if (j == splitedPath.length - 1) { child.setText(xlsElement.defaultValue); } currentElement = child; } } } } logger.info("Génération du fichier XML OK."); }
Que fait l'instruction isRootElement de JDOM ? d'après la doc elle retourne vrai si l'élément est un élément racine, mais ça ne marche pas dans mon cas, j'en déduis que l'élément racine est l'élément principal de l'arbre XML, et non pas un noeud...
Voila, je continue de revoir mes conditions logiques, si vous aviez une idée de comment tester l'existence de fils qui m'aurait échappé (isAncestor() sans argumentspar exemple)...
Je vous remercie une nouvelle fois pour votre attention.
![]()
Partager