Bonjour,
Je suis sur un projet dans lequel je dois à un moment ouvrir un fichier XML pour y rajouter des balises. Vu que ce n'est pas bien compliqué en théorie, je fais ça avec dom directement.
L'ajout de balise fonctionne bien, cependant j'avais deux problèmes initialement (je ne faisait pas encore le lien avec la DTD) :
Le premier était la disparition de la balise xmlns dans l'élément racine de mon XML ( ça, à priori, c'est pas trop grave) :
deviens alors :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?xml version="1.0" encoding="UTF-8"?> <TDPCos xmlns="http://..." id="COS-PLANS-LNKS-PROD-TDPV41-01" CosType="product"> .... </TDPCos>
jusque là, rien de bien grave donc, mais vient alors le second souci, les attributs de mes balises n'ont pas leur ordre initial qui est conservé, ce qui fait qu'au final :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?xml version="1.0" encoding="UTF-8"?> <TDPCos id="COS-PLANS-LNKS-PROD-TDPV41-01" CosType="product"> .... </TDPCos>
deviens alors :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?xml version="1.0" encoding="UTF-8"?> <TDPCos xmlns="http://..." id="COS-PLANS-LNKS-PROD-TDPV41-01" CosType="product"> .... </TDPCos>
Ca ne m'a pas vraiment choqué au début mais un autre programme ( que je ne doit pas modifier) recherche l'ID de l'objet TDPCos comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?xml version="1.0" encoding="UTF-8"?> <TDPCos CosType="product" id="COS-PLANS-LNKS-PROD-TDPV41-01"> .... </TDPCos>
Ce qui fait que bien sûr, du coup, ça marche plus vu que l'attribut récupéré est maintenant "CosType" et non plus "id"
Code : Sélectionner tout - Visualiser dans une fenêtre à part theCurrentObjectID = theParser.getAttributeValue(0);
mon code initial était fait comme ça :
création du document :
modification du document
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public Document getDomDocument() throws ParserConfigurationException, SAXException, IOException { if (domDocument == null) { DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); domDocument = constructeur.parse(fusFile); } return domDocument; }
Et enfin sauvegarde du document dans le fichier :
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 //add the tags while (index < fusObjects.getLength()) { Node node = fusObjects.item(index); NamedNodeMap attributes = node.getAttributes(); if (attributes != null && attributes.getNamedItem("id") != null) { Node idAttribute = attributes.getNamedItem("id"); String idValue = idAttribute.getNodeValue(); copiedObjects.add(idValue); //check that the tag is one that must be modified if (tagsList.containsKey(idValue)) { ArrayList<Element> tagsForThisObjects = tagsList.get(idValue); for (Element tag : tagsForThisObjects) { //check that the link don't exist yet if (!nodeHaveTag((Element) node, tag, idValue)) { node.appendChild(tag); } } } } index++; }
J'ai ensuite essayé de rajouter un lien vers la XSD, mon code de création du document est alors devenu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public void saveToFile() throws TransformerFactoryConfigurationError, TransformerConfigurationException, TransformerException, IOException { DOMSource domSource = new DOMSource(domDocument); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(domSource, result); FileWriter fileWriter = new FileWriter(fusFile); fileWriter.write(writer.toString()); fileWriter.close(); }
Résultat des courses, mes attributs sont toujours dans le désordre ( je pensais que le fait de lier à la XSD forcerai peut être à conserver l'ordre des attributs, mais visiblement ça ne fait que de la validation), j'ai quelques erreurs dans mon log du au fait que mon XML d'entrée ne respecte déjà pas exactement la XSD, et dans chaque balise que je rajoute j'ai maintenant un attribut vide
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 public Document getDomDocument() throws ParserConfigurationException, SAXException, IOException { if (domDocument == null) { DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance(); fabrique.setIgnoringComments(true); fabrique.setNamespaceAware(true); fabrique.setValidating(true); fabrique.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); fabrique.setAttribute(JAXP_SCHEMA_SOURCE, getXSDFile()); DocumentBuilder constructeur = fabrique.newDocumentBuilder(); domDocument = constructeur.parse(fusFile); } return domDocument; }qui a apparu
Code : Sélectionner tout - Visualiser dans une fenêtre à part xmlns=""
Bref je comprend plus grand chose, je sais plus trop ce je dois rajouter et à quel moment pour que mon XML de sortie soit strictement égal à mon XML d'entrée, avec mes balises que je rajoute en plus....
Toute aide est la bienvenue, il faudrai pour bien aller j'ai terminé ça avant ce soir 17h et je sens que tout seul je vais pouvoir tatonner un moment !!
merci
Partager