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 :

[Débutant] Automatiser la lecture d'un fichier de configuration


Sujet :

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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 162
    Points : 60
    Points
    60
    Par défaut [Débutant] Automatiser la lecture d'un fichier de configuration
    Bonjour,

    Mon appli comporte des fichiers XML de configuration.
    Quelle serait le moyen le plus simple pour parcourir l'arborescence ? Est-il judicieux d'utiliser des fichiers XSD afin d'automatiser le plus possible ?

    Merci.

  2. #2
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    un Schema XSD ne sert qu'a la validation du XML.

    Pour lire le XML il faut utiliser soit JDOM/SAX ou une api comme commons digester ou XStream.
    Je crois que la classe properties peut aussi prendre un fichier XML.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 162
    Points : 60
    Points
    60
    Par défaut
    Ci-joint ma fonction qui lit mon fichier XML :

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    private void lireGrilleSudoku() throws ParserConfigurationException, SAXException, IOException
    	{
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
     
    		File fichier = new File(this.emplacmtGrilleSudoku);
     
    		Document doc = builder.parse(fichier);
     
    		// Recupere le permier element du fichier de parametres
    		Element elem1 = doc.getDocumentElement();
     
    		// recupere les elements suivants du fichier de parametres
    		// si le premier élément est sudoku !
    		if (elem1.getTagName().equals("sudoku"))
    		{
    			NodeList listeElem1 = elem1.getChildNodes();
     
    			for (int i=0; i<listeElem1.getLength(); i++)
    			{
    				Node NodeElem2 = listeElem1.item(i);
     
    				if (NodeElem2 instanceof Element)
    				{
    					Element elem2 = (Element) NodeElem2;
     
    					// Récupère les éléments suivants seulement, et seulement si l'élément courant est "grille"
    					if (elem2.getTagName().equals("grille"))
    					{
    						NodeList listeElem2 = elem2.getChildNodes();
     
    						for (int k=0; k<listeElem2.getLength(); k++)
    						{
    							Node NodeElem3 = listeElem2.item(k);
    							if (NodeElem3 instanceof Element)
    							{
    								Element elem3 = (Element) NodeElem3;
    								//System.out.println(elem3.getTagName());
    								//if (elem3.getTagName().equals("ligne1"))
    								//{
    								if (elem3.getTagName().equals("ligne1"))
    								{
    									NodeList listeElem3 = elem3.getChildNodes();
    									for (int l=0; l<listeElem3.getLength(); l++)
    									{
    										Node NodeElem4 = listeElem3.item(l);
    										if (NodeElem4 instanceof Element)
    										{
    											Element elem4 = (Element) NodeElem4;
    											//System.out.println(elem4.getChildNodes());
     
    											if (elem4.getChildNodes().equals("colonne1"))
    											{
    												System.out.println(elem4.getChildNodes());
    											}
    										}
    									}
    									//if (elem3.getTagName().equals("colonne"))
    									//{
    										//this.port = Integer.parseInt(paramElem.getFirstChild().toString());
    									//}
    								}
    								//}
    								if (elem3.getTagName().equals("ligne2"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne3"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne4"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne5"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne6"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne7"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne8"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    								if (elem3.getTagName().equals("ligne9"))
    								{
    									//this.adresse = paramElem.getFirstChild().toString();
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    Y-a-t-il un moyen plus simple pour lire ce fichier XML ?
    Avec ce code, si je rajoute un mot clé dans l'arborescence, le programme ne pleut plus tourner !

    merci !

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Si tu définis un XSD, tu peux aussi te tourner vers JAXB.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 162
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Ricky81
    Si tu définis un XSD, tu peux aussi te tourner vers JAXB.
    Ci-joint ma fonction qui lit mon fichier XML :

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      private void lireGrilleSudoku() throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); File fichier = new File(this.emplacmtGrilleSudoku); Document doc = builder.parse(fichier); // Recupere le permier element du fichier de parametres Element elem1 = doc.getDocumentElement(); // recupere les elements suivants du fichier de parametres // si le premier élément est sudoku ! if (elem1.getTagName().equals("sudoku")) { NodeList listeElem1 = elem1.getChildNodes(); for (int i=0; i<listeElem1.getLength(); i++) { Node NodeElem2 = listeElem1.item(i);   if (NodeElem2 instanceof Element) { Element elem2 = (Element) NodeElem2;   // Récupère les éléments suivants seulement, et seulement si l'élément courant est "grille" if (elem2.getTagName().equals("grille")) { NodeList listeElem2 = elem2.getChildNodes(); for (int k=0; k<listeElem2.getLength(); k++) { Node NodeElem3 = listeElem2.item(k); if (NodeElem3 instanceof Element) { Element elem3 = (Element) NodeElem3; //System.out.println(elem3.getTagName()); //if (elem3.getTagName().equals("ligne1")) //{ if (elem3.getTagName().equals("ligne1")) { NodeList listeElem3 = elem3.getChildNodes(); for (int l=0; l<listeElem3.getLength(); l++) { Node NodeElem4 = listeElem3.item(l); if (NodeElem4 instanceof Element) { Element elem4 = (Element) NodeElem4; //System.out.println(elem4.getChildNodes()); if (elem4.getChildNodes().equals("colonne1")) { System.out.println(elem4.getChildNodes()); } } } //if (elem3.getTagName().equals("colonne")) //{ //this.port = Integer.parseInt(paramElem.getFirstChild().toString()); //} } //} if (elem3.getTagName().equals("ligne2")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne3")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne4")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne5")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne6")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne7")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne8")) { //this.adresse = paramElem.getFirstChild().toString(); } if (elem3.getTagName().equals("ligne9")) { //this.adresse = paramElem.getFirstChild().toString(); } } } } } } } }
    Y-a-t-il un moyen plus simple pour lire ce fichier XML ?
    Avec ce code, si je rajoute un mot clé dans l'arborescence, le programme ne pleut plus tourner !

    merci !

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    perso j'utilise pas mal DOM, et un truc efficace à mon gout pour avoir une structure claire est d'utiliser la recursivité :

    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
     
    /** Fonction pour lancer le parse du fichier */
    private void parcoursXML(String fichier)
    {
            DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
            fabrique.setValidating(false);
            DocumentBuilder constructeur = fabrique.newDocumentBuilder();
            Document document = constructeur.parse( new File(fichier) );
     
            //on recupere la racine du document
            NodeList config = document.getChildNodes();
     
            //on lance le parcours du document a partir de sa racine
            parcoursFichierXML(config);
    }
     
    /** Cette fonction ne fait que demander de traiter les fils d'un noeud */
    private void parcoursFichierXML(NodeList fichierDOM)
        {
            for(int i=0; i < fichierDOM.getLength(); i++)   
            {
                afficherNoeud(fichierDOM.item(i));
            }
        }
     
    /** Cette fonction permet de traiter le noeud : Afficher ses attributs methodes 
    * et demander de traiter ses fils
    */
    private void afficherNoeud(Node noeud)
        {  
           // Si le noed est un element et s'il n'est pas l'element racine	
           // Alors on le traite
           if(noeud.getNodeType() == Element.ELEMENT_NODE)
           {    
     
    	    	   //System.out.println("Type "+noeud.getNodeType());
    	           //System.out.println("Nom "+noeud.getNodeName());
    	           //System.out.println("Value "+noeud.getNodeValue());
    	    	   //System.out.println("Taille :"+noeud.getChildNodes().item(0).toString());
    	           Text txt0 = (Text)noeud.getChildNodes().item(0);
    	           System.out.println("DATA "+txt0.getData() );
     
                      if(noeud.getNodeName().equals("SOUS_RACINE"))
                      {
                          //traitement sur ton nom
                      }
     
           //Si le noeud possede des fils 
           //qui nous interesse et que l'on va donc vouloir traiter
           if( noeud.getNodeName().equals("RACINE") )
               parcoursFichierXML(noeud.getChildNodes());
           }
       }
    Avec ca, il te suffit de rajouter un if de traitement dans afficherNoeud pour prendre en compte un nouveau fichier XML et enrichir le if sur parcoursFichierXML pour prendre en compte un nouveau ELEMENT qui possederait des fils

    En esperant que cela t'aide

  7. #7
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour

    Pour le parsing de fichier XML, SAX est plus souple que DOM. Si tu ne fais pas de validation et que tu ne programmes pas comme un porc, les modifications mineures (ça peut aller jusqu'à l'ajout de balise) sur ton XSD n'impacterons pas ton programme.

    Vu ton parsing, je pense que SAX est plus approprié que DOM.

    yann

Discussions similaires

  1. Lecture d'un fichier de configuration dans une boucle
    Par sdecorme dans le forum MATLAB
    Réponses: 17
    Dernier message: 05/11/2013, 16h16
  2. Lecture/Ecriture de fichiers de configuration (.ini)
    Par khayyam90 dans le forum Contribuez
    Réponses: 1
    Dernier message: 28/12/2010, 20h37
  3. Lecture d'un fichier de configuration.
    Par piemur2000 dans le forum Design Patterns
    Réponses: 1
    Dernier message: 20/11/2010, 15h15
  4. Lecture/écriture de fichiers de configuration
    Par Matthieu Brucher dans le forum Boost
    Réponses: 13
    Dernier message: 10/11/2008, 19h31
  5. Réponses: 4
    Dernier message: 23/03/2006, 17h12

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