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 :

Modifier un fichier XML existant


Sujet :

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

  1. #1
    Membre actif
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Par défaut Modifier un fichier XML existant
    Bonjour à tous

    J'ai un gros fichier XML, de la forme:
    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
     
    <module name="GLOBAL">
        <module name="name1"/>
        <module name="name2"/>
        <module name="name3"/>
        <module name="name4">
            <property name="prop1"/>
            <property name="prop2"/>
            <property name="prop3"/>
            <property name="prop4"/>
        </module>
     
        <module name="name5">     
           <module name="name6"/>
           <module name="name7">
               <property name="prop1"/>
               <property name="prop2"/>
            </module>
        </module>
    </module>
    Et je voudrais creer un fichier xml pour chaque module, du genre :

    name1.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <module name="GLOBAL">
        <module name="name1"/>
    </module>
    name2.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <module name="GLOBAL">
        <module name="name2"/>
    </module>
    name6.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <module name="GLOBAL">
        <module name="name5">     
           <module name="name6"/>
        </module>
    </module>
    etc etc...

    Je sais comment creer/écrire un fichier xml avec des OutputsStream/write/flush et tout le tintouin, je sais lire/parcourir un XML avec javax.xml.parsers, org.w3c.dom.Document/Element/NodeList...
    Le problème c'est que je vois pas comment combiner les deux... Une fois que j'ai récuperer on Element courant (mon module) je dois le réécrire dans un nouveau fichier, mais j'aimerais éviter si possible d'avoir à parser tous attributs propriétés et les réécrire...
    Existe t'il un moyen de récupérer tout le String entre deux noeuds xml par exemple?
    Peut-on supprimer des noeuds existants dans un fichier XML? Car a la rigueur je pourrais copier le fichier xml de base autant de fois que je le veux, en supprimant tous les noeuds, sauf celui que je veux garder, mais je sais pas si c'est possible...

    Merci ;)

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tu devrais plutôt utiliser JDOM, ce sera plus facile.

    Il suffit de charger le premier fichier, ce qui fait un Document, puis de prendre la liste des <module>, ce qui sera une List de Element*.
    Pour chacun d'eux, tu crées un nouveau Document vide, et tu y insères l'élément. Puis tu écris ce Document dans un fichier.

    * Attention, piège ! Une List de Element se récupère normalement ainsi : List<Element> modules = document.getRootElement().getChildren("module");. Mais là ces éléments nous voulons les enlever du Document d'origine et les mettre dans un autre. Ce qui fait que la List, liée au document, perdra les éléments au fur et à mesure que le document les perd. Et on ne peut pas itérer sur une List en même temps qu'on enlève ses éléments.
    Il faut faire : List<Element> modules = new ArrayList<>(document.getRootElement().getChildren("module"));.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Par défaut
    Merci. Avec jdom et sax, j'arrive à créer mon fichier et à le parcourir, mais je ne comprends pas bien comment rajouter des Elements à un Document.

    Mon fichier xml de départ est composé d'un élt «*module*» racine et de sous-noeud «*module*», chaque sous-noeud peut avoir des sous-noeud, et un de ces sous-noeuds aura également des sous-sous-noeud module, ce qui complique la tache car je veux créer un fichier pour chaque feuille (mais qui garde l'arborescence de cette feuille uniquement).

    Ce que je ne comprends pas, c'est comment rajouter des nœuds au nouveau document, à chaque fois j'ai des exceptions du genre*:
    org.jdom2.IllegalAddException: The element "module" could not be added as the root of the document: The Content already has an existing parent document
    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
     
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import javax.xml.parsers.ParserConfigurationException;
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.JDOMException;
    import org.jdom2.input.SAXBuilder;
    import org.jdom2.output.Format;
    import org.jdom2.output.XMLOutputter;
    import org.xml.sax.SAXException;
     
    public class CheckstyleXMLGenerator {
     
    		private static void createXMLFile(String xmlPath) throws ParserConfigurationException, SAXException, IOException, JDOMException { //TODO EXCEPTIONS
    		// XML file to load
    		File xmlFile = new File(xmlPath);
    		SAXBuilder sxb = new SAXBuilder();
    		Document document = sxb.build(xmlFile);
     
    		// Root elt
    		Element root = document.getRootElement(); //Must be a "module" node of name "Root"
     
    		// New xml doc
    		Document newXMLDocument;
     
    		// List of modules
    		List<Element> modules = new ArrayList<Element>(root.getChildren("module"));
     
    			for (Element currentElement : modules) {
    			String currentElementName = currentElement.getAttributeValue("name");
    			newXMLDocument = new Document(root); // Je dois toujours rajouter la racine au doc
    			// test si feuille ou node
    			if (currentElement.getAttributeValue("module").equals("Node")) {
    				//noeud, pour tous les sous-noeuds: creer un nouveau doc avec la racine, le noeud currentElementName, et le fils
     
    			}else {
    				// feuille rajouter au doc
    			}				
    			// save  + creer le vrai fichier
    			saveFile(currentElement.getAttributeValue("name"), newXMLDocument); 
    		}
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		try {
    			createXMLFile("sun.xml");
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	private static void saveFile(String fileName, Document doc) {	
    		XMLOutputter xmlOutput = new XMLOutputter(Format.getPrettyFormat());
    		try {
    			xmlOutput.output(doc, new FileOutputStream("essai2/" + fileName));
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    Mes fichiers crées ont tous que l'entete et pas d'élements...
    Je sais pas si j'ai été très clair avec mon arborescence donc en gros

    fichier à séparer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <module name="Root">
        <module name="feuille1">
           <property name="format"/>
        </module>
        <module name="Feuille2"/>
        <module name="Node">        
            <module name="Feuille3"/>   
        </module>
    </module>
    je veux dans ce cas 3 fichiers:
    feuille1.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <module name="Root">
        <module name="feuille1">
           <property name="format"/>
        </module>
    </module>
    feuille2.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <module name="Root">
       <module name="Feuille2"/>
    </module>
    feuille3.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <module name="Root">
        <module name="Node">        
            <module name="Feuille3"/>   
        </module>
    </module>

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par jklms Voir le message
    Ce que je ne comprends pas, c'est comment rajouter des nœuds au nouveau document, à chaque fois j'ai des exceptions du genre*:
    org.jdom2.IllegalAddException: The element "module" could not be added as the root of the document: The Content already has an existing parent document
    Oouups. Effectivement, il faut appeler detach() avant. Sinon l'élément pense qu'on lui demande d'avoir deux parents, et c'est une erreur.

    Citation Envoyé par jklms Voir le message
    Mon fichier xml de départ est composé d'un élt «*module*» racine et de sous-noeud «*module*», chaque sous-noeud peut avoir des sous-noeud, et un de ces sous-noeuds aura également des sous-sous-noeud module, ce qui complique la tache car je veux créer un fichier pour chaque feuille (mais qui garde l'arborescence de cette feuille uniquement).
    Ah, je n'avais pas compris. Dans ce cas tu vas bien être obligé de recopier chaque élément de l'arborescence, pour obtenir le même mais avec un seul fils.
    Mais je t'avoue que je vois pas trop la difficulté. D'abord chercher des feuilles (éléments qui n'ont pas de fils,) et pour chacun d'eux, créer un fichier. Pour créer un fichier, reparcourir toute la chaîne des ascendants pour en créer une copie. Pour copier un élément, en créer un autre de même nom, parcourir ses attributs, et pour chaque attribut en créer un de même nom et même valeur.
    C'est... Pas sorcier, en fait. Je vois pas trop ce qui te gêne.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Inscrit en
    Octobre 2013
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 24
    Par défaut
    Grace à detach() et removeContent() j'arrive à m'en sortir, c'était detach qui me manquait, et grace à toi une foi que j'ai repris tout ça à tête reposée, ca marche nickel !

    merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/06/2009, 18h38
  2. Réponses: 6
    Dernier message: 05/02/2008, 22h52
  3. [XML-XSLT]Modifier un fichier XML grâce à un formulaire
    Par Maurice Fallou dans le forum Langage
    Réponses: 4
    Dernier message: 28/02/2007, 16h57
  4. [VB NET]: Modifier un fichier XML via un DataSet
    Par ADONET dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/02/2006, 18h54
  5. [DOM] [Débutant(e)] Modifier un fichier XML avec DOM
    Par macks dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 05/07/2005, 14h13

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