Bonjour,
Je suis coincé depuis plusieurs jours sur ce sujet et aurait bien besoin d'aide :-).
Je précise tout de suite que je ne suis pas développeur Java, je suis normalement utilisateur du code en question et pas éditeur, mais j'avais besoin de faire qq modifications mineures. Avec de l'aide (merci Google), je ne suis pas loin du compte mais il me reste ce souci "d'ordre".
Le programme complet est assez complexe (et loin au dessus de mon niveau), mais ma question est sur un point précis, que j'espère qu'on puisse résoudre sans avoir à tout reprendre.
Globalement le programme calcul une table de valeur à partir de différentes inputs et configuration, et écrit le résultat dans un fichier XML.
Le format de ce fichier XML est défini par un fichier XML "Template", donner un input au programme.
Ce que je voudrait obtenir, c'est que dans le fichier XML généré par le programme, les attributs soient dans le même ordre que dans le Template (j'ai bien lu qu'en XML cet ordre n'importe pas, mais pour le pauvre humain (c'est bibi) qui lit régulièrement ces fichiers, c'est bien pratique de pouvoir mettre les attributs dans un ordre voulu). Actuellement mon fichier de sortie semble les avoir dans l'ordre alphabétique.
Ci-dessous un extrait du code avec les différentes étapes.
J'ai pu lire sur internet que la librairie "DOM" simple ne permettait pas de gérer l'ordre mais qu'il fallait utiliser des librairies comme SAX ou JAX.
J'ai trouvé une propriété "propOrder" dans JAX qui semblait prometteuse, mais qui semble ne pouvoir s'appliquer que sur une classe définie, du coup ça m'embête:
- car ça ferait changer bcp de la structure du code, ce que j'aimerais éviter (
- et ça semble nécessiter que je définisse la classe "en dur" alors que je voudrais si possible garder le mécanisme du "Template", pour que la prochaine (ou mon successeur) n'ait qu'à modifier le Template XML (facile) pour ajuster l'ordre, sans avoir à se replonger dans le code
Merci d'avance de votre aide,
Cordialement.
---- Paramètres "globaux" que je ne connais pas bien, mais utilisés ensuite
1 2 3 4 5 6 7 8 9 10 11
| DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
TransformerFactory transformerFactory = TransformerFactory.newInstance();
builder = factory.newDocumentBuilder();
transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.VERSION, "1.0");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); |
---- Création du document vierge (org.w3c.dom.Document)
Document document= builder.newDocument();
---- Récupération du "Template"
1 2 3 4 5 6
| Document xml_template = builder.parse(config.getXML_template_file_path());
// get the header of the template ( should specify header for the generated file )
Element root = xml_template.getDocumentElement();
// get the first child ( shall be dataobject specification )
Element child = (Element)path.evaluate("*", root, XPathConstants.NODE);
Element header = (Element) document.importNode(root, false); |
---- (longue partie pour créer le header, assez fixe donc pas de prob)
---------------------------------------------------
document.appendChild(header);
---- Arrive la partie intéressante sur la construction du contenu. D'abord création d'un tableau vide
Map<String,String> DatasToSet = new HashMap<String,String>();
---- Remplissage suivant divers critères, avec des DatasToSet.put("Nom de l'attribut","valeur de l'attribut")
---- Ensuite, comparaison avec le Template pour voir si les attributs matchent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Element field = (Element) document.importNode(child, false);
for (Map.Entry<String, String> entry : DatasToSet.entrySet())
{
// if the attribute is defined the attribute is set
if ( child.hasAttribute(entry.getKey()))
{
field.setAttribute(entry.getKey(), entry.getValue());
}
// if the attribute is not defined in the template of the data field
// the calculated field is inserted as comment
else
{
Comment field_comment = document.createComment(entry.getKey() + "=\""+ entry.getValue()+"\"");
field.appendChild(field_comment);
}
} |
----- Ajout du résultat dans le document
header.appendChild(field);
----- Une fois la boucle de remplissage finie, export dans le fichier de sortie
1 2 3
| DOMSource source = new DOMSource(document);
StreamResult output = new StreamResult(OutputFile);
transformer.transform(source, output); |
Partager