Inversions d'attributs avec DOM
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:
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:
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:
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:
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:
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:
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:
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:
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:
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 :mur:
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