我的目的是将xml文件读入Dom对象,编辑dom对象,这涉及删除一些节点。
完成此操作后,我希望将Dom恢复到其原始状态,而不实际解析XML文件。
无论如何我可以克隆第一次解析xml文件后获得的dom对象。我们的想法是不要一直阅读和解析xml,只需保留原始dom树的副本。
答案 0 :(得分:15)
您可以在org.w3c.dom.Document上使用importNode API:
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);
}
}
答案 1 :(得分:7)
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();
这将是用于制作DOM文档副本的Java 1.5解决方案。请查看Transformer Factory和Transformer
答案 2 :(得分:5)
您可以克隆树或仅克隆具有DOM cloneNode(boolean isDeepCopy)API的节点。
Document originalDoc = parseDoc();
Document clonedDoc = originalDoc.cloneNode(true);
遗憾的是,由于Document上的cloneNode()是(根据API)特定的实现,我们必须采用防弹方式,即创建一个新的Document并从原始文档导入克隆节点:
...
Document clonedDoc = documentFactory.newDocument();
cloneDoc.appendChild(
cloneDoc.importNode(originalDoc.getDocumentElement(), true)
);
请注意,所有操作都不是线程安全的,因此要么只在本地使用它们,要么使用Thread-Local或同步它们。
答案 3 :(得分:1)
我会坚持使用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"?>