[英]How do I copy DOM nodes from one document to another in Java?
我在將節點從一個文檔復制到另一個文檔時遇到問題。 我已經使用了 Node 中的 AdoptNode 和 importNode 方法,但它們不起作用。 我也試過 appendChild 但這會引發異常。 我正在使用 Xerces。 這不是在那里實施嗎? 有沒有另一種方法可以做到這一點?
List<Node> nodesToCopy = ...;
Document newDoc = ...;
for(Node n : nodesToCopy) {
// this doesn't work
newDoc.adoptChild(n);
// neither does this
//newDoc.importNode(n, true);
}
問題是 Node 包含很多關於它們的上下文的內部狀態,包括它們的出身和擁有它們的文檔。 adoptChild()
和importNode()
都沒有將新節點放置在目標文檔中的任何位置,這就是您的代碼失敗的原因。
由於您想復制節點而不是將其從一個文檔移動到另一個文檔,因此您需要采取三個不同的步驟......
for(Node n : nodesToCopy) {
// Create a duplicate node
Node newNode = n.cloneNode(true);
// Transfer ownership of the new node into the destination document
newDoc.adoptNode(newNode);
// Make the new node an actual item in the target document
newDoc.getDocumentElement().appendChild(newNode);
}
Java 文檔 API 允許您使用importNode()
組合前兩個操作。
for(Node n : nodesToCopy) {
// Create a duplicate node and transfer ownership of the
// new node into the destination document
Node newNode = newDoc.importNode(n, true);
// Make the new node an actual item in the target document
newDoc.getDocumentElement().appendChild(newNode);
}
cloneNode()
和importNode()
上的true
參數指定是否需要深度復制,即復制節點及其所有子節點。 由於 99% 的情況下您都希望復制整個子樹,因此您幾乎總是希望這是真的。
AdoptChild 不會創建副本,它只是將節點移動到另一個父節點。
您可能需要 cloneNode() 方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.