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 :

Fusionner deux fichiers KML [JDOM]


Sujet :

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

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut Fusionner deux fichiers KML
    Bonjour,

    J'aurais quelques petites questions à ce sujet (cf. discussion : http://www.developpez.net/forums/d11...iers-xml-java/ )

    Si le fichier est balisé de la sorte, je me retrouve effectivement, en suivant la procédure citée ci-dessus, avec la balise <Document> présente deux fois, ce qui évidement rend le fichier fichier final inexploitable.

    Quelle approche je peux adopter dans ce cas là ?

    Code KML1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://earth.google.com/kml/2.2">
    	<Document>
    		<name>File1</name>
    		<description><![CDATA[Created on 6/7/2012 at 1:18 AM]]></description>
    		<Placemark>
    			<name>Test</name>
    			<Point>
    				<coordinates>-0.673017,44.872883,0</coordinates>
    			</Point>
    			<visibility>1</visibility>
    		</Placemark>
    	</Document>
    </kml>
    Code KML2 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://earth.google.com/kml/2.2">
    	<Document>
    		<name>File2</name>
    		<description><![CDATA[Created on 6/7/2012 at 1:18 AM]]></description>
    		<Placemark>
    			<name>Test2</name>
    			<Point>
    				<coordinates>-0.673017,44.872883,0</coordinates>
    			</Point>
    			<visibility>1</visibility>
    		</Placemark>
    	</Document>
    </kml>
    Code FINAL : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://earth.google.com/kml/2.2">
    	<Document>
    		<name>File1</name>
    		<description><![CDATA[Created on 6/7/2012 at 1:18 AM]]></description>
    		<Placemark>
    			<name>Test</name>
    			<Point>
    				<coordinates>-0.673017,44.872883,0</coordinates>
    			</Point>
    			<visibility>1</visibility>
    		</Placemark>
    	</Document>
    	<Document>
    		<name>File2</name>
    		<description><![CDATA[Created on 6/7/2012 at 1:18 AM]]></description>
    		<Placemark>
    			<name>Test2</name>
    			<Point>
    				<coordinates>-0.673017,44.872883,0</coordinates>
    			</Point>
    			<visibility>1</visibility>
    		</Placemark>
    	</Document>
    </kml>

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Deux choses :

    #1 - la méthode que j'ai indiquée n'aurait pas produit cela. Elle aurait produit

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <merged>
      <kml xmlns="http://earth.google.com/kml/2.2">
    	<Document>
    		<name>File1</name>
    		<description><![CDATA[Created on 6/7/2012 at 1:18 AM]]></description>
    		<Placemark>
    			<name>Test</name>
    			<Point>
    				<coordinates>-0.673017,44.872883,0</coordinates>
    			</Point>
    			<visibility>1</visibility>
    		</Placemark>
    	</Document>
      </kml>
      <kml xmlns="http://earth.google.com/kml/2.2">
    	<Document>
    		<name>File2</name>
    		<description><![CDATA[Created on 6/7/2012 at 1:18 AM]]></description>
    		<Placemark>
    			<name>Test2</name>
    			<Point>
    				<coordinates>-0.673017,44.872883,0</coordinates>
    			</Point>
    			<visibility>1</visibility>
    		</Placemark>
    	</Document>
      </kml>
    </merged>
    #2 - S'il y a des règles précises à respecter dans le cas de KML,
    -- c'est une autre question
    -- il faut énoncer ces règles.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Désolé pour cette question non adaptée dans ce topic.

    Le problème concernant la fusion KML est réglé, avec une solution peut être pas idéale, mais bon !!!! (je ne maîtrise pas suffisamment Jdom)

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par tarzip Voir le message
    Le problème concernant la fusion KML est réglé, avec une solution peut être pas idéale, mais bon !!!! (je ne maîtrise pas suffisamment Jdom)
    Tu as parfaitement le droit de poser des questions pour voir s'il n'y a pas plus adapté que ce que tu as trouvé.
    Je demande juste un peu de capacité à expliquer clairement la situation, rien de plus facile pour un habitué des ordinateurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Pour moi l’énoncé était suffisamment claire pour pouvoir s’imprégner de la problématique.

    Sinon, plutôt que d’utiliser la méthode detach(), je me suis tourné vers la méthode clone(). Le code ci-dessous n’est absolument pas propre mais il me permet d’envisager une solution pour mon cas bien précis, c’est-à-dire : la fusion de deux fichiers KML utilisant la balise <Placemark>.

    Par contre, coté occupation mémoire, ce n'est pas le top.

    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
    public class MergeKml{
     
    	private static void cloneElement(List elementPlacemark, Element elementDocument){
    		 for (int i = 0; i < elementPlacemark.size(); i++) {
    		    	Element oldElement = (Element) elementPlacemark.get(i);
    		    		Element elementPlacemarkClone = oldElement.clone();
    		    		elementDocument.addContent(elementPlacemarkClone);
     
    		    }		
    	}
    	public static void main(String[] args) throws JDOMException, IOException {
    	    SAXBuilder builder = new SAXBuilder();
    	    Document kml1 = builder.build("kml1.kml");
    	    Document kml2 = builder.build("kml2.kml");	    
    	    Element racineKml1= kml1.getRootElement();
    	    Element racineKml2= kml2.getRootElement();	    
    	    Namespace nameSpace = racineKml1.getNamespace();
    	    List elementPlacemark1 = racineKml1.getChild("Document", nameSpace)
    	    		.getChildren("Placemark", nameSpace);
    	    List elementPlacemark2 = racineKml2.getChild("Document", nameSpace)
    	    		.getChildren("Placemark", nameSpace);	    
    	    Document kmlFinal = new Document();
    	    Element elementKml = new Element("kml",nameSpace);	    
    	    kmlFinal.setRootElement(elementKml);	    
     
    	    Element elementDocument = new Element("Document",nameSpace);
    	    elementKml.addContent(elementDocument);
     
    	    Element elementName = new Element("name",nameSpace);	    
    	    elementDocument.addContent(elementName);
     
    	    elementName.addContent("Fusion de 2 KML");
     
    	    Element elementDescription = new Element("description",nameSpace);	    
    	    elementDocument.addContent(elementDescription);
    	    Calendar cal = Calendar.getInstance();	    
    	    CDATA cData = new CDATA("Created on "+ cal.getTime());
    	    elementDescription.addContent(cData);	    
     
    	    cloneElement(elementPlacemark1, elementDocument);	    
    	    cloneElement(elementPlacemark2, elementDocument);
    	    new XMLOutputter(Format.getPrettyFormat()).output(kmlFinal, System.out);
     
    	}
    }

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par tarzip Voir le message
    Pour moi l’énoncé était suffisamment claire pour pouvoir s’imprégner de la problématique.
    Sans doute. Mais en principe on ne veut pas "s'imprégner de la problématique" on veut "savoir quel est le problème" et de là voir comment t'aider à le résoudre. À la limite les débats d'opinion sont les bienvenus aussi, mais dans un nouveau sujet.

    Citation Envoyé par tarzip Voir le message
    Le code ci-dessous n’est absolument pas propre mais il me permet d’envisager une solution pour mon cas bien précis, c’est-à-dire : la fusion de deux fichiers KML utilisant la balise <Placemark>.
    Je ne trouve pas ça trop mal.

    Personnellement, dans un cas comme ça, je choisirais une de ces deux approches :

    -#1 Je ne garde que deux objets Document : les deux KMLs de départ. Et j'insère les données du second dans le premier.

    -#2 J'utilise trois objets Document : un par KML de départ et un pour la fusion des deux, vide au départ et dans lequel j'insère les données des deux autres.
    Mais je le construis en chargeant un fichier XML modèle, pas en créant des objets JDOM les uns après les autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String template =
    "<kml xmlns='http://earth.google.com/kml/2.2'>\n" +
    "  <Document>\n" +
    "    <name/>\n" +
    "    <description/>\n" +
    "  </Document>\n" +
    "</kml>";
    Ou alors dans un fichier .xml qui soit avec mes classes Java.

    Citation Envoyé par tarzip Voir le message
    Par contre, coté occupation mémoire, ce n'est pas le top.
    C'est le but, non ? Puisqu'utiliser clone() au lieu de detach() sert uniquement à consommer plus de mémoire...

    Enfin, de toute façon JDOM est très consommateur de mémoire à la base.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Merci pour ces conseils, et je vais donc essayer d’améliorer ce code, avec un petit penchant pour la solution #1.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Bonjour,

    j'ai modifié le code pour avoir un résultat suivant la méthode #1, mais j'aimerai essayer la méthode #2. Où puis je trouver un petit didacticiel qui me mette sur la voie ?

    Merci

    Code Méthode#1 : 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
    public class MergeKml{
    	public static void main(String[] args) throws JDOMException, IOException {
    	    SAXBuilder builder = new SAXBuilder();
    	    Document kml1 = builder.build("kml1.kml");
    	    Document kml2 = builder.build("kml2.kml");	  
     
    	    Namespace nameSpace = kml1.getRootElement().getNamespace();
    	    Element elementDocument= kml1.getRootElement().getChild("Document", nameSpace);
     
    	    List<Element> elementPlacemark = kml2.getRootElement().getChild("Document", nameSpace)
    	    		.getChildren("Placemark", nameSpace);
     
    	    for (int i = 0; i < elementPlacemark.size(); i++) {
    	    	Element oldElement = (Element) elementPlacemark.get(i);
    	    	Element elementPlacemarkClone = oldElement.clone();
    	    	elementDocument.addContent(elementPlacemarkClone);
    	    }	
     
    	    new XMLOutputter(Format.getPrettyFormat()).output(kml1, System.out);
    	}
    }

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par tarzip Voir le message
    mais j'aimerai essayer la méthode #2. Où puis je trouver un petit didacticiel qui me mette sur la voie ?
    ?

    C'est de l'utilisation de base de JDOM tout ce qu'il y a de plus normal. La voie c'est charger des documents XML et faire des trucs avec.
    Je t'ai même donné un exemple qui illustre l'idée. Qu'est-ce qui coince ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    C'est à ce niveau là que ça coince :
    Mais je le construis en chargeant un fichier XML modèle,....

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Charger ? => SAXBuilder.
    Fichier XML modèle ? Mon code exemple qui commence par String template =.

    Tu pourrais essayer de jouer un peu avec ce que je te donne, avant de demander d'autres choses.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Hummm, juste une petite remarque en toute sympathie :

    Si toi tu es persuadé que l’on peut marcher sur l’eau, moi je suis convaincu que l’on coule systématiquement.

    Alors, comme je suis arrivé à résoudre mon problème, grâce à ton aide et je t’en remercie, je pense que je vais en rester là. Dommage !!!!!

    Cdt

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    J'ai pas trop compris ce qui ne va pas, pour être honnête. Ni ce qui empêche de le dire -_-°.
    Mais de toute façon, la solution à laquelle tu es arrivée était déjà bien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Fusionner deux fichiers XML en Java
    Par gotteserbin dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 30/04/2014, 16h58
  2. fusionner deux fichiers .exe en un seul
    Par splifo dans le forum Windows
    Réponses: 10
    Dernier message: 03/05/2012, 02h59
  3. Réponses: 2
    Dernier message: 16/05/2008, 11h49
  4. Fusionner deux fichiers identiques access
    Par poplite dans le forum Access
    Réponses: 1
    Dernier message: 06/02/2008, 22h46
  5. Fusionner deux fichiers
    Par frouge dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 22/05/2007, 13h05

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