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 :

[JAXP] inserer un element à partir d'un autre document [DOM]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut [JAXP] inserer un element à partir d'un autre document
    salut
    je voudrait inserer un element d'un docment X dans un document Y
    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
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.TransformerException;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    public class ElementTest {
    
    	/**
    	 * @param args
    	 * @throws ParserConfigurationException
    	 * @throws TransformerException
    	 */
    	public static void main(String[] args) {
    		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
    				.newInstance();
    		DocumentBuilder documentBuilder;
    		try {
    			documentBuilder = documentBuilderFactory.newDocumentBuilder();
    			Document document = documentBuilder.newDocument();
    			Element e = JAXPutilities.createElement("ab");
    			Element e1 = JAXPutilities.createElement("aa");
    			Element e2 = JAXPutilities.createElement("bb");
    			document.appendChild(e);
    			System.out.println("docum=" + JAXPutilities.xmlToString(document));
    		} catch (ParserConfigurationException e3) {
    			System.out.println("ParserConfigurationException");
    			e3.printStackTrace();
    		} catch (TransformerException e) {
    			System.out.println("TransformerException");
    			e.printStackTrace();
    		}
    
    	}
    
    }
    la methode createElement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static Element createElement(String elementName) throws ParserConfigurationException
    	{
    		DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
    		DocumentBuilder documentBuilder = null;		
    		documentBuilder = documentBuilderFactory.newDocumentBuilder();
    		Document document=documentBuilder.newDocument();
     
    		Element element =document.createElement(elementName); 
    		return element;
    	}
    j'obtient l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" org.w3c.dom.DOMException: DOM005 Wrong document
    	at org.apache.xerces.dom.ParentNode.internalInsertBefore(ParentNode.java:393)
    	at org.apache.xerces.dom.ParentNode.insertBefore(ParentNode.java:325)
    	at org.apache.xerces.dom.DocumentImpl.insertBefore(DocumentImpl.java:410)
    	at org.apache.xerces.dom.NodeImpl.appendChild(NodeImpl.java:226)
    	at ElementTest.main(ElementTest.java:26)
    apres des recherches, j'ai trouvé qu'il faut utiliser importNode au lieu de appendChild
    Avec importNode, pas d'erreur mais l'element n'est pas ajouté:
    j'obtien en executant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    docum=<?xml version="1.0" encoding="UTF-8"?>

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    De mémoire, il faut faire un adopt sur le Document pour "migrer" le noeud vers ce document, puis faire un append sur le noeud parent pour le mettre là où tu veux.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Salut Deaf
    je n'ai pas compris :
    il faut faire un adopt sur le Document

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Un truc dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monDoc.adopt(monNoeud);

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Un truc dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monDoc.adopt(monNoeud);
    j'ai fait
    mais toujours sans resultat: pas d'erreur mais aussi l'element n'est pas toujours ajouté

  6. #6
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Citation Envoyé par Deaf Voir le message
    il faut faire un adopt sur le Document pour "migrer" le noeud vers ce document, puis faire un append sur le noeud parent pour le mettre là où tu veux.
    As-tu uniquement fait le adoptNode?

  7. #7
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par Deaf Voir le message
    As-tu uniquement fait le adoptNode?
    j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    documentBuilder = documentBuilderFactory.newDocumentBuilder();
    			Document document = documentBuilder.newDocument();
    			Element e = JAXPutilities.createElement("ab");
    			Element e2 = JAXPutilities.createElement("bb");
    			Node n=document.importNode(e2, true);
    			document.adoptNode(n);

  8. #8
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Je ne me suis jamais servi de importNode, mais je soupçonne cette méthode de faire en gros la même chose que adoptNode. Mais l'une comme l'autre ne font que "migrer" le noeud, elles ne l'insèrent pas. Tu ne couperas pas à un append.

    Ce que je te suggérais de faire, se résume à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodeParent.append(doc.adoptNode(nodeToImport));
    PS: j'ai pas la javadoc sous les yeux, donc la syntaxe peut ne pas être exacte, mais l'idée est là.

  9. #9
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Je ne me suis jamais servi de importNode, mais je soupçonne cette méthode de faire en gros la même chose que adoptNode. Mais l'une comme l'autre ne font que "migrer" le noeud, elles ne l'insèrent pas. Tu ne couperas pas à un append.

    Ce que je te suggérais de faire, se résume à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nodeParent.append(doc.adoptNode(nodeToImport));
    PS: j'ai pas la javadoc sous les yeux, donc la syntaxe peut ne pas être exacte, mais l'idée est là.
    toujours pas de resultat

  10. #10
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bon,
    ça, ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc1 = documentBuilder.newDocument();
    Document doc2 = documentBuilder.newDocument();
    Element elt1 = doc1.createElement("ab");
    Element elt2 = doc2.createElement("bb");
    doc1.appendChild(elt1);
    elt1.appendChild(doc1.adoptNode(elt2));
    A la fin doc1, c'est : (sans formatage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8" standalone="no"?><ab><bb/></ab>
    Si en reprenant ça, tu n'y arrives pas, il faudra regarder ce que font les JAXPutilities.createElement.

  11. #11
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Bon,
    ça, ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc1 = documentBuilder.newDocument();
    Document doc2 = documentBuilder.newDocument();
    Element elt1 = doc1.createElement("ab");
    Element elt2 = doc2.createElement("bb");
    doc1.appendChild(elt1);
    elt1.appendChild(doc1.adoptNode(elt2));
    A la fin doc1, c'est : (sans formatage)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8" standalone="no"?><ab><bb/></ab>
    Si en reprenant ça, tu n'y arrives pas, il faudra regarder ce que font les JAXPutilities.createElement.
    Oui Deaf
    votre exemple a marché
    voici la methode JAXPutilities.createElement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static Element createElement(String elementName) throws ParserConfigurationException
    	{
    		DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
    		DocumentBuilder documentBuilder = null;		
    		documentBuilder = documentBuilderFactory.newDocumentBuilder();
    		Document document=documentBuilder.newDocument();
     
    		Element element =document.createElement(elementName); 
    		return element;
    	}
    je l'utilise seulement pour créer un objet ou est alors mon probleme?

  12. #12
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    A chaque fois que tu veux créer un Element, tu créés:
    - un DocumentBuilderFactory
    - un DocumentBuilder
    - un Document

    A priori, comme tu travailles sur un seul document XML, tu devrais toujours utiliser le même document. La solution la plus simple est de supprimer ta méthode qui au final ne fait rien de particulier et d'appeler directement la méthode createElement de ton Document, comme je l'ai fait dans mon exemple.

  13. #13
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par Deaf Voir le message
    A chaque fois que tu veux créer un Element, tu créés:
    - un DocumentBuilderFactory
    - un DocumentBuilder
    - un Document

    A priori, comme tu travailles sur un seul document XML, tu devrais toujours utiliser le même document. La solution la plus simple est de supprimer ta méthode qui au final ne fait rien de particulier et d'appeler directement la méthode createElement de ton Document, comme je l'ai fait dans mon exemple.
    Merci infiniment Deaf
    c'est bien fait

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. appel des elements d'une classe à partir d'une autre
    Par oceane751 dans le forum Langage
    Réponses: 4
    Dernier message: 02/01/2008, 21h52
  3. Lister des element HTML à partir d'une autre frame
    Par psychomatt dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/03/2006, 18h03
  4. [CR] Inserer une image à partir d'un fichier
    Par Gandalf24 dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 23/07/2003, 10h55
  5. Lancer un prog du DD à partir d'un autre prog
    Par le mage tophinus dans le forum Assembleur
    Réponses: 12
    Dernier message: 22/01/2003, 14h24

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