Клонирование дом.Документ объекта - PullRequest
13 голосов
/ 08 марта 2011

Моя цель - прочитать XML-файл в объект Dom, отредактировать объект dom, что включает удаление некоторых узлов.

После того, как это будет сделано, я хочу восстановить Dom в его первоначальное состояние без фактического разбора файла XML.

Могу ли я в любом случае клонировать объект dom, полученный после первого анализа файла xml.Идея состоит в том, чтобы не читать и не анализировать xml все время, просто сохранить копию оригинального дерева dom.

Ответы [ 4 ]

15 голосов
/ 08 марта 2011

Вы можете использовать importNode API на org.w3c.dom.Document:

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

Полный пример

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

    }
}
7 голосов
/ 08 марта 2011
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();

Это будет решение Java 1.5 для создания копии документа DOM. Взгляните на трансформаторный завод и трансформатор

5 голосов
/ 22 мая 2013

вы можете клонировать дерево или только узел с API DOM cloneNode (boolean isDeepCopy).

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

к сожалению, поскольку cloneNode () в Document (в соответствии с API) специфичен для реализации, мы должны пойти по пуленепробиваемому пути, то есть создать новый Document и импортировать клонированные узлы из исходного документа:

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

обратите внимание, что ни одна из операций не является поточно-ориентированной, поэтому либо используйте их только локально, либо Thread-Local или синхронизируйте их.

1 голос
/ 09 сентября 2013

Я бы придерживался второго предложения с TransformerFactory.С помощью importNode вы не получите полную копию документа.Заголовок не копируется.

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

Это не вернет вышеприведенное, поскольку оно не скопированоОн будет использовать то, что когда-либо будет содержаться в вашем новом документе.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...