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) :

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>
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 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 xmlns="http://..." 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 CosType="product" id="COS-PLANS-LNKS-PROD-TDPV41-01">
....
</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
theCurrentObjectID = theParser.getAttributeValue(0);
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"

mon code initial était fait comme ça :

création 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;
	}
modification du document

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++;
		}
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
 
	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();
	}
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
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;
	}
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 qui a apparu

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