2011-03-08 14 views
9

Mi propósito es leer el archivo xml en el objeto Dom, edite el objeto dom, que implica la eliminación de algunos nodos.Clonación objeto dom.Document

Una vez hecho esto, deseo restaurar el Dom a su estado original sin analizar realmente el archivo XML.

De todos modos, puedo clonar el objeto dom que obtuve después de analizar el archivo xml por primera vez. la idea es evitar leer y analizar xml todo el tiempo, solo guarde una copia del árbol dom original.

+0

víctima eventual de http://stackoverflow.com/questions/279154/how-can-i-clone-an-entire-document-using-the-java-dom –

Respuesta

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(); 

Ésta sería la solución de Java 1.5 para hacer una copia del documento DOM. Echar un vistazo a Transformer Factory y Transformer

+0

isEqualNode() no devuelve true si copia de esta manera – ka3ak

+0

¡Este método sigue procesando instrucciones y comentarios en la copia! –

11

Usted podría utilizar la API en importNode org.w3c.dom.Document:

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

Ejemplo completo

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

¡Cuidado, esta forma de copiar el documento eliminará las instrucciones de procesamiento o los comentarios dentro del archivo! –

+0

¡Creo que esto eliminará cualquier UserData que se anexó a los nodos en el documento anterior! Tiene sentido que lo haga, pero uno tiene que ser consciente – ParkerHalo

3

se podría clonar una árbol o solo el nodo con la API DOMs cloneNode (boolean isDeepCopy).

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

por desgracia, ya cloneNode() el documento está (según API) de aplicación específica, tenemos que ir a dar una forma a prueba de balas, es decir, crear un nuevo documento e importación clonado del nodo del documento original :

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

nota de que ninguna de las operaciones son hilos de proceso seguro, así que o usarlos sólo a nivel local, o subproceso local o sincronizarlas.

0

Me quedaría con la segunda sugerencia con TransformerFactory. Con importNode no obtiene una copia completa del documento. El encabezado no se copia.

<?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"> 

Esto no devolverá lo anterior porque esto no se copia. Se usará lo que su nuevo documento contenga.

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