将元素从一个DOMDocument复制到另一个DOMDocument

时间:2009-04-20 06:55:15

标签: xml dom msxml

有没有办法将(深)元素从一个DOMDocument实例复制到另一个DOMDocument实例?

<Document1>
  <items>
    <item>1</item>
    <item>2</item>
    ...
  </items>
</Document1>

<Document2>
  <items>
  </items>
</Document>

我需要将/ Document1 / items / *复制到/ Document2 / items /.

似乎DOMDocument没有从另一个DOMDocument导入节点的方法。它甚至无法从xml文本创建节点。

当然我可以使用字符串操作来实现这一点,但也许有更简单的解决方案?

3 个答案:

答案 0 :(得分:3)

您可以使用cloneNode方法并传递true参数。该参数指示是否递归克隆引用节点的所有子节点。

答案 1 :(得分:0)

在Java中:

void copy(Element parent, Element elementToCopy)
{
   Element newElement;

   // create a deep clone for the target document:
   newElement = (Element) parent.getOwnerDocument().importNode(elementToCopy, true);

   parent.appendChild(newElement);
}

答案 2 :(得分:0)

以下函数将复制文档并保留基本<!DOCTYPE>,但使用Transformer则不然。

 public static Document copyDocument(Document input) {
        DocumentType oldDocType = input.getDoctype();
        DocumentType newDocType = null;
        Document newDoc;
        String oldNamespaceUri = input.getDocumentElement().getNamespaceURI();
        if (oldDocType != null) {
            // cloning doctypes is 'implementation dependent'
            String oldDocTypeName = oldDocType.getName();
            newDocType = input.getImplementation().createDocumentType(oldDocTypeName,
                                                                      oldDocType.getPublicId(),
                                                                      oldDocType.getSystemId());
            newDoc = input.getImplementation().createDocument(oldNamespaceUri, oldDocTypeName,
                                                              newDocType);
        } else {
            newDoc = input.getImplementation().createDocument(oldNamespaceUri,
                                                              input.getDocumentElement().getNodeName(),
                                                              null);
        }
        Element newDocElement = (Element)newDoc.importNode(input.getDocumentElement(), true);
        newDoc.replaceChild(newDocElement, newDoc.getDocumentElement());
        return newDoc;
    }