Rajouter des éléments à l’aide de chaine de caractère

Rajouter des éléments à l’aide de chaine de caractère - XML/XSL - Programmation

Marsh Posté le 04-04-2007 à 10:00:41    

Bonjour,
J%u2019aimerais rajouter des informations à un XML préexistant avec dom a partir d%u2019une chaine de caractère.
Le tout en JAVA.

 

Par exemple :
Document document ;

 

Contient :

 

<annuaire>
*<personne>
**<nom>Smith</nom>
**<prenom>John</prenom>
*</personne>
*<personne>
**<nom>Dupont</nom>
**<prenom>Pierre</prenom>
*</personne>
</annuaire>

 

Je souhaite recevoir une chaine de caractère

 

String nouveauxMembres

 

Qui contient la chaine :

 

*<personne>
**<nom>Gary</nom>
**<prenom>Cooper</prenom>
*</personne>
*<personne>
**<nom>Einstein</nom>
**<prenom>Albert</prenom>
*</personne>

 

Je souhaiterais pouvoir faire une opération genre :

 

ElementAnnuaire.addSousElement(nouveauxMembres)

 

et avoir au final dans document :

 

<annuaire>
*<personne>
**<nom>Smith</nom>
**<prenom>John</prenom>
*</personne>
*<personne>
**<nom>Dupont</nom>
**<prenom>Pierre</prenom>
*</personne>
*<personne>
**<nom>Gary</nom>
**<prenom>Cooper</prenom>
*</personne>
*<personne>
**<nom>Einstein</nom>
**<prenom>Albert</prenom>
*</personne>
</annuaire>

 

Mon cas est beaucoup plus compexe que celui %u2013ci, en fait je manipule du SVG, donc écartez la solution qui consiste a extraire les infos utiles du texte et a les balancer a des setAttribute ou a des createElement.

 

Merci d%u2019avance !


Message édité par finch911 le 04-04-2007 à 11:49:15
Reply

Marsh Posté le 04-04-2007 à 10:00:41   

Reply

Marsh Posté le 04-04-2007 à 20:09:17    

Tu dois d'abord transformer ton String en DOM (en utilisant un DocumentBuilder). Ensuite si je me souviens bien tu dois importer ce nouveau document dans celui que tu avais déja avec document.importNode(). Et après tu peux faire un appendChild() à l'endroit qui t'intéresse.

Reply

Marsh Posté le 05-04-2007 à 16:13:37    

Code :
  1. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  2. DocumentBuilder db = dbf.newDocumentBuilder();
  3. InputSource is = new InputSource(new StringReader(strDonneeSVGaAjouter));
  4. Document newDoc = db.parse(is);
  5.            
  6. Element e = document.getElementById("1" );
  7.            
  8. e.appendChild(newDoc);


 
La chaine de caractère xml est strDonneeSVGaAjouter
Le document de base qui contient déjà du svg est document
 
Voilà l'erreur que j'ai:

org.w3c.dom.DOMException: The current node (type: 1, name: g) do not allow children of the given type (type: 9, name: #document)

 
 
Si j'essaie: document.importNode(newDoc,true);
 
j'ai:
org.w3c.dom.DOMException: Cannot import node.
 
 
Je souhaite ajouter a l'élément "<g id="1">" ce nouveau document. Comment convertir le type document en un type élement qu'il accepterai?


Message édité par finch911 le 05-04-2007 à 16:18:35
Reply

Marsh Posté le 05-04-2007 à 16:16:21    

Tu dois pas appender le document (newDoc) mais plutot le node à la racine du document.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 06-04-2007 à 00:26:53    

Pour clarifier les choses, voici la note du w3c sur le importNode(): http://www.w3.org/DOM/faq.html#ownerdoc
Il y a des chances que le e.appendChild(newDoc.getDocumentElement()) fonctionne mais visiblement un e.appendChild(document.importNode(newDoc.getDocumentElement(), true)) est préférable.

Reply

Marsh Posté le 10-04-2007 à 11:34:14    

Element e = document.getElementById("pwet" );
e.appendChild(newDoc.importNode(newDoc.getDocumentElement(), true));
 
J'ai:
 
org.w3c.dom.DOMException: The given node (type: 1, name: g) was not > created by the current document.

Reply

Marsh Posté le 10-04-2007 à 19:09:26    

C'est curieux, chez moi c'est l'inverse. J'ai fait le test avec le code suivant (testé avec le JDK 1.4.2 ou 1.5).

Code :
  1. import java.io.*;
  2. import java.util.*;
  3. import javax.xml.parsers.*;
  4. import org.w3c.dom.*;
  5. import org.apache.xml.serialize.*;
  6. public class Essai {
  7. public static void main(String[] args) throws Exception {
  8.  DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
  9.  Document a = db.parse(new FileInputStream(args[0]));
  10.  Document b = db.parse(new FileInputStream(args[1]));
  11.  Element a1 = (Element)a.getDocumentElement().getFirstChild();
  12.  Element b1 = (Element)b.getDocumentElement().getFirstChild();
  13.  // Ceci ne fonctionne pas
  14. //  a1.appendChild(b1);
  15.  // Ceci fonctionne
  16.  a1.appendChild(a.importNode(b1, true));
  17.  XMLSerializer serializer = new XMLSerializer(System.out, null);
  18.  serializer.serialize(a);
  19. }
  20. }


En input j'ai respectivement des fichiers contenant "<a><a1><a2/></a1></a>" et "<b><b1><b2/></b1></b>".
 
Si j'essaye avec "a1.appendChild(b1)" j'ai bien "org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than the one that created it."
 
Mais avec le "a1.appendChild(a.importNode(b1, true))" j'obtiens "<a><a1><a2/><b1><b2/></b1></a1></a>" comme attendu.

Reply

Marsh Posté le 16-04-2007 à 20:12:16    

Merci, ca marche!

Reply

Marsh Posté le 26-06-2008 à 17:58:54    

Salut a tous,
 
 
je suis interessé par votre example car j'ai un souci proche de votre solution.
 
la différence avec l'exemple de rx__, c'est que au lieu d'ajouter un element dans un document,
je veux ajouter un obejt de type noeud.
 
 
avez vous une solution.  
 
Pour plus d'explication j'ai posté un autre message sur un autre forum : http://www.developpez.net/forums/s [...] ost3424129
 
 
merci pour votre aide
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed