IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Ordonner attributs XML


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre averti
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Par défaut Ordonner attributs XML
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Document document= builder.newDocument();
    ---- Récupération du "Template"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    ---------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.appendChild(header);
    ---- Arrive la partie intéressante sur la construction du contenu. D'abord création d'un tableau vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header.appendChild(field);
    ----- Une fois la boucle de remplissage finie, export dans le fichier de sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DOMSource source = new DOMSource(document);
    StreamResult output = new StreamResult(OutputFile);
    transformer.transform(source, output);

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Hello,

    les attributs XML n'ont pas d'ordre, et ce que tu demandes ne peut pas être fait, en tout cas pas sans écrire toi-même les outils de gestion XML au lieu d'utiliser ceux qui existent. Non, ni DOM, ni SAX, ni JAX, ni rien.

    Je reconnais que le besoin "ce serait plus pratique de manipuler ces fichiers à l'éditeur de texte si les attributs étaient dans l'ordre que je choisis" a un certain sens, mais ce besoin n'a pas été retenu. Du coup la solution de tout le monde c'est d'utiliser des éléments au lieu d'attributs. Les éléments, eux, ils ont un ordre.

    A la rigueur, tu peux te contenter d'écrire toi-même la conversion object DOM en mémoire, vers format texte XML. Et au cours de cette conversion tu écris les attributs dans l'ordre que tu veux. Ça permet au moins de n'avoir que ça à refaire soi-même depuis le début. Mais dans ce cas c'est le convertisseur DOM vers texte XML qui connaît l'ordre des attributs. L'objet DOM en mémoire, lui, n'a pas d'ordre des attributs.

    Exemple : quand on signe numériquement un document XML, on a besoin de l'écrire de manière canonique, et dans ce cas les attributs doivent apparaître dans un ordre précis. Cet ordre est l'ordre lexicographique, et pas un autre. Le convertisseur DOM vers texte XML peut donc s'en charger.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Par défaut
    Bonjour,

    Merci beaucoup pour la réponse.
    C'est dommage et un peu étonnant que ça n'existe pas, mais si c'est comme ça, c'est comme ça :-).
    Ecrire moi-même la conversion de l'objet DOM, je n'ai pas trop su par quel bout commencé, du coup j'ai fait quelque chose d'un peu plus artisanal en remplissant le fichier de sortie "en mode texte" avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Output =  new PrintWriter(new BufferedWriter (new FileWriter(OutputFile,true)));
    Et en faisant les balises XML à la main.
    C'est beaucoup moins "beau" et robuste que le programme d'origine, mais à court terme ça me donne le bon fichier de sortie.

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lire attribut XML
    Par MoscoBlade dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/04/2007, 15h30
  2. Ajout d'attributs XML dans jsviz
    Par citronized dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/04/2007, 12h36
  3. [XSLT] Changer la valeur d'un attribut XML
    Par Rouxy007 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 14/02/2007, 23h06
  4. [VB6]Lecture d'attributs XML
    Par BouB dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/05/2006, 16h01
  5. modifier la valeur d'un attribut xml
    Par totoche dans le forum ASP
    Réponses: 2
    Dernier message: 13/12/2005, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo