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 :

Ajouter des noeuds existants à un Document XML en DOM


Sujet :

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

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 49
    Points
    49
    Par défaut Ajouter des noeuds existants à un Document XML en DOM
    Bonjour à tous,
    Bonne année, à toute la communauté Developez.net.

    Donc, pour en revenir à mon problème, je suis actuellement en apprentissage avec le langage Android. Je rencontre un problème avec API DOM, lorsque que j'ajoute des nœuds à un document xml avec DOM.
    Tout d'abord, je récupère trois flux RSS que je convertis en document xml de type.
    org.w3c.dom.Document
    Pas de problème jusqu'ici.

    Puis je récupére les nœuds Item des deux autres Document xml que je copie dans le premier Document xml, mais quand j’essaie de le faire avec la méthode appendChild, j’obtiens une exception de type DomException, avec le seul message Null.
    Voici un extrait de mon code

    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
     
    for(int i=0;i<params.length;i++) {
                    //Instancier une URL avec son adresse
                    URL url = new URL(params[i]);
     
                    //Constuire la connection HTTP
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
     
                    //Convertir le flux en inputStream
                    InputStream stream = connection.getInputStream();
                    Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
                    if(document != null){
                        documentsXml[i] = document;
                    }
                }
                NodeList list2 = documentsXml[1].getElementsByTagName("item");
                NodeList list3 = documentsXml[2].getElementsByTagName("item");
                NodeList racine = documentsXml[0].getElementsByTagName("channel");
                channel = (Element) racine.item(0);
               try {
                    for (int i = 0; i < list2.getLength(); i++) {
                        Element element = (Element) list2.item(i);
                        if (element.getNodeType() == Node.ELEMENT_NODE) {
                            channel.appendChild(element);
                        }
                    }
                }catch(DOMException e){
                    Log.i("Element-xml", "Nb fils  :" + channel.getChildNodes().getLength());
                    e.getStackTrace();
                }
    Les flux RSS sont passés en paramètres à la méthode doInBackground(), dans lequel je suis.

    Les documents sont stockés dans un tableau de type Document. Quand je fais du pas à pas en mode débogage, l’erreur survient, lorsque que la méthode appendChild est invoquée dans la boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
       for (int i = 0; i < list2.getLength(); i++) {
                        Element element = (Element) list2.item(i);
                        if (element.getNodeType() == Node.ELEMENT_NODE) {
                            channel.appendChild(element);
                        }
                    }
    L’objet list2 contient bien les nœuds item et le premier document xml documentXml[0] dans le nœud « channel » contient bien des nœuds enfants.

    Est-ce que c’est un problème, si les nœuds que je souhaite ajouter porte les mêmes noms, que certains nœuds enfants du nœud « channel ».En effet dans le nœud « channel », il y a déjà plusieurs nœud item, et les nœuds que j’essaie d’ajouter ont le nom item. Pourquoi je n’arrive pas à rajouter des nœuds provenant d’autres document xml dom au premier document xml dans le nœud « channel ».

    Pourriez-vous m’aider, car je coince sur ce problème, je ne comprends pas l’exception DomException qui indique seulement null sans autres précisions. Pourant channel n’est pas null, et les nœuds que j’ajoute au channel non plus, quand je suis en mode débogage.

    J’aurai besoin de vos lumières, merci par avance.

    Bonne années à tous.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Hello,

    Si tu essayais le même code sur un environnement de dev Java classique au lieu de plate-forme Android, le message d'erreur serait beaucoup plus explicite.
    (Tu ne le sais peut-être pas, mais le fait qu'Android se programme en Java, signifie que du code pour Java classique ou pour Android c'est pareil. Tout ce qui n'utilise pas les classes spécifiques à Android peut être testé en dehors d'Android, notamment tout ce qui est manipulation de documents XML avec DOM. Et Android, c'est beau et vendeur parce que c'est sur téléphone et tout, mais l'environnement ne vaut pas du tout un bon vrai Java de 20 ans d'âge. Les aides de programmation sont bien meilleures sur du vrai Java que si tu restes enfermé sans raison dans le cloisonnement Android.)

    Tu obtiens grosso-modo ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it.
    	at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:357)
    	at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:288)
    	at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:237)
    	at org.thelvin.dom.TestDomImport.main(TestDomImport.java:37)
    Et du coup tout est clair.

    Un nœud DOM fait partie d'un Document et d'un seul. Tu ne peux donc pas prendre un nœud d'un Document et lui faire appendChild dans un autre Document. Il ne saurait plus auquel il appartient.
    Pour faire ce que tu veux, il faut utiliser Document.importNode() sur le nœud qui vient d'un autre Document, ce qui en fera une copie. Puis tu peux faire appendChild() de cette copie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (element.getNodeType() == Node.ELEMENT_NODE) {
      Node copy = documentsXml[0].importNode(element, true); // true pour faire une copie profonde du contenu
      channel.appendChild(copy);
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup Thelvin pour ta réponse pertinente, désormais quand j'aurai un soucis avec Android, je penserais à tester mon code en pure java, pour avoir des message d'erreur plus explicites.

    Je vais tester tout ça et je mets à jour la discussion.

    Bonne année.

Discussions similaires

  1. objet pour stocker la liste des noeuds dans un document xml
    Par nancy maman dans le forum Général Python
    Réponses: 3
    Dernier message: 29/08/2011, 16h28
  2. Ajouter des noeud dans un fichier XML
    Par chinoismasque dans le forum Windows Phone
    Réponses: 4
    Dernier message: 02/08/2011, 16h32
  3. [XMLBEANS] Surfer et ajouter des noeuds dans mon XML
    Par akrogames dans le forum APIs
    Réponses: 0
    Dernier message: 05/12/2010, 17h16
  4. Réponses: 5
    Dernier message: 23/04/2010, 21h26
  5. [DOM] Ajouter des noeuds à un fichier XML
    Par Louis-Guillaume Morand dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 07/04/2007, 14h55

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