2011-03-08 4 views
9

Mon but est de lire le fichier xml dans l'objet Dom, de modifier l'objet dom, ce qui implique la suppression de certains nœuds. Une fois cela fait, je souhaite restaurer le Dom dans son état d'origine sans réellement analyser le fichier .xml. Y at-il de toute façon je peux cloner l'objet dom obtenu après avoir analysé le fichier xml pour la première fois. l'idée est d'éviter de lire et d'analyser xml tout le temps, il suffit de garder une copie de l'arbre d'origine.Clonage de l'objet dom.Document

+0

possible de duper http://stackoverflow.com/questions/279154/how-can-i-clone-an-entire-document-using-the-java-dom –

Répondre

5
TransformerFactory tfactory = TransformerFactory.newInstance(); 
Transformer tx = tfactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
DOMResult result = new DOMResult(); 
tx.transform(source,result); 
return (Document)result.getNode(); 

Ceci serait la solution Java 1.5 pour faire une copie du document DOM. Jetez un oeil à Transformer Factory et Transformer

+0

isEqualNode() ne retourne pas true si vous copiez de cette manière – ka3ak

+0

Cette méthode permet de continuer à traiter les instructions et les commentaires dans la copie! –

11

Vous pouvez utiliser importNode API sur org.w3c.dom.Document:

Node copy = document.importNode(node, true); 

Exemple complet

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 

     Document originalDocument = db.parse(new File("input.xml")); 
     Node originalRoot = originalDocument.getDocumentElement(); 

     Document copiedDocument = db.newDocument(); 
     Node copiedRoot = copiedDocument.importNode(originalRoot, true); 
     copiedDocument.appendChild(copiedRoot); 

    } 
} 
+0

Attention, cette façon de copier le document supprimera les instructions de traitement ou les commentaires dans le fichier! –

+0

Je crois que cela supprimera toute UserData qui a été ajoutée à tous les nœuds de l'ancien document! Il est logique que cela le fasse, mais il faut être conscient – ParkerHalo

3

vous pouvez cloner un tree ou seulement le noeud avec DOMs cloneNode (boolean isDeepCopy) API.

Document originalDoc = parseDoc(); 
Document clonedDoc = originalDoc.cloneNode(true); 

malheureusement, depuis cloneNode() sur le document est (selon API) mise en œuvre spécifique, nous devons aller un moyen de l'épreuve des balles, qui est, créer un nouveau à partir du document original du noeud cloné document et l'importation :

... 
Document clonedDoc = documentFactory.newDocument(); 
cloneDoc.appendChild(
    cloneDoc.importNode(originalDoc.getDocumentElement(), true) 
); 

noter qu'aucune des opérations sont thread-safe, donc soit les utiliser que localement, ou local fil ou les synchroniser.

0

Je voudrais coller avec la deuxième suggestion avec TransformerFactory. Avec importNode, vous n'obtenez pas une copie complète du document. L'en-tête n'est pas copié.

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<?aid style="50" type="snippet" readerVersion="6.0" featureSet="257" product="8.0(370)" ?>  
<?aid SnippetType="PageItem"?><Document DOMVersion="8.0" Self="d"> 

Cela ne retournerait pas ce qui précède car cela n'est pas copié. Il utilisera ce que votre nouveau document contient.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>