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 :

Ajout d'éléments triés selon leur nom et problème de redondance. [JDOM]


Sujet :

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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Ajout d'éléments triés selon leur nom et problème de redondance.
    Bonjour à tous et merci par avance pour votre attention.

    Je suis actuellement en train de faire un logiciel en Java qui me permet, à partir de données récupérées et stockées dans des listes, de créer plusieurs fichiers XML. J'avais auparavant adopté une solution qui consistait a générer le XML global puis, lors de l'enregistrement, d'enlever des éléments selon leur nom... ce qui n'est pas si mal mais qui posait quelques problèmes, comme le fait que le filtrage soit codé en dur, et que si jamais certaines données n'étaient pas récupérées mais attendues, cela faisait planter l'exécution.

    Je travaille alors sur une solution consistant à trier dès la création de l'arbre, afin de générer directement les différents fichiers XML sans passer par un fichier global. Je rencontre cependant des problèmes.

    Mon problème est le suivant : dans un de mes arbres, j'ai un élément (complex, ayant des fils) de nom Protocol, que je ne dois pas ajouter au fichier. Un autre élément (complex) de nom General, se trouvant au même niveau que Protocol, contient un élément (simple type, sans fils) de nom Protocol, et je dois garder cet élément. Or, lors de l'exécution, soit mon programme supprime les deux, soit il garde les deux (soit il plante et me met une erreur sans message d'erreur).

    Voici mon code qui supprime tous les éléments de nom Protocol :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     private void generateXMLPart1()
        {
    	logger.info("Génération du fichier XML...");
     
    	for (XLSElement xlsElement : this.xlsElement)
    	{
    	    String[] splitedPath = xlsElement.path.split(XLSDefine.SPLIT_SEPARATOR);
    	    Element currentElement = this.rootDOMPart1;
     
    	    for (int j = 0; j < splitedPath.length; j++)
    	    {
     
    		if ((((splitedPath[j].contains(XML_PROTOCOL)) == true) 
    			&& ((currentElement.getChildren().size() > 1) == true)) 
    			|| ((splitedPath[j].contains(XML_DATAPOINT)) == true)) 
    		{
    		    break; 
    		}
     
     
     
     
    		if (((splitedPath[j].contains(XML_PROTOCOL)) && !(currentElement.getChild(
    				splitedPath[j]).getChildren().isEmpty())))
    		{
    		    logger.debug("entré");
    		}
     
    		else if ((((splitedPath[j].contains(XLSDefine.EXCLUDE_TOKEN)) == false) && ((splitedPath[j]
    			.isEmpty()) == false)))
    		{
    		    logger.debug(currentElement.getName() + " contient : "
    			    + currentElement.getChildren().toString());
     
    		    if ((isIncludedInDOM(currentElement.getChildren(), splitedPath[j])) == true)
    		    {
    			currentElement = currentElement.getChild(splitedPath[j]);
    		    }
     
    		    else
    		    {
    			Element child = new Element(splitedPath[j]);
     
    			logger.debug("On ajoute " + child + " à " + currentElement);
     
    			currentElement.addContent(child);
     
    			if ((splitedPath[j - 1].equalsIgnoreCase(XML_SLAVE)) == true)
    			{
    			    Attribute id = new Attribute(XML_ID, XLSDefine.EXCLUDE_TOKEN);
     
    			    Attribute modbusaddr = new Attribute(XML_MODBUSADDR, "");
     
    			    child.setAttribute(id);
    			    child.setAttribute(modbusaddr);
    			}
     
    			if (j == splitedPath.length - 1)
    			{
    			    child.setText(xlsElement.defaultValue);
    			}
     
    			currentElement = child;
    		    }
    		}
    	    }
    	}
     
    	logger.info("Génération du fichier XML OK.");
        }
    mes deux conditions if sont la source de mes embêtements (un des deux ne sert que pour le test d'ailleurs). L'idée est de tester si l'élément de nom Protocol possède des fils : si oui, on enlève cet élément, sinon on le garde. Or lorsque je teste l'existence de fils (getChildren().size ou getChildren().isEmpty() ) le programme part dans les choux...

    Que fait l'instruction isRootElement de JDOM ? d'après la doc elle retourne vrai si l'élément est un élément racine, mais ça ne marche pas dans mon cas, j'en déduis que l'élément racine est l'élément principal de l'arbre XML, et non pas un noeud...

    Voila, je continue de revoir mes conditions logiques, si vous aviez une idée de comment tester l'existence de fils qui m'aurait échappé (isAncestor() sans argumentspar exemple)...

    Je vous remercie une nouvelle fois pour votre attention.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Rebonjour !

    Je viens de trouver l'erreur éventuelle lorsque je sépare bien mes conditions logiques : en fait je teste l'existence de fils qui n'ont pas encore été créé !

    Si je fais mes tests sur la longueur du chemin (un élément est basé sur un chemin de la sorte : /general/protocol), je résoud mon problème en comparant à l'itération.

    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (((splitedPath[j].contains(XML_DATAPOINT)) == true)
    			|| ((splitedPath[j].contains(XML_PROTOCOL)) && (splitedPath.length != j + 1)))
    la longueur doit être égale à l'itération+1 car le path commence par un slash, et ma méthode de récupération le prend en compte. Par exemple, pour /general/protocol, j'obtiens après un split 3 strings : (), (general) et (protocol). Un élément qui n'a pas de descendant aura donc un path qui s'achève.

    Je m'excuse pour avoir retenu votre attention pour pas grand chose ! Merci !

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    C'est une bonne chose que tu aies résolu ton problème tout seul.

    Tu veux bien utiliser [CODE] au lieu de [CITATION] ? C'est illisible et on comprend rien de ce que tu fais.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    arg toutes mes excuses ! je n'avais pas trouvé comment faire le code ! C'est modifié.

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

Discussions similaires

  1. supprimer des fichiers selon leur nom
    Par qmike dans le forum VBScript
    Réponses: 3
    Dernier message: 12/06/2012, 09h28
  2. Regrouper Des données selon leur nom
    Par apt dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/04/2012, 10h48
  3. Lire des fichiers selon leur nom
    Par guiguilelotois dans le forum LabVIEW
    Réponses: 4
    Dernier message: 18/05/2009, 13h55
  4. [JDOM] ajout d'éléments et de leur contenu textuel
    Par Smix007 dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 11/03/2008, 23h25
  5. Recuperer les colonnes d'une table selon leur nom
    Par lolo_momo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/07/2007, 11h56

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