将DOMNodes从一个DOMDocument复制到另一个DOMDocument [英] Copy DOMNodes from one DOMDocument to another

查看:94
本文介绍了将DOMNodes从一个DOMDocument复制到另一个DOMDocument的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试结合两个这样的XML文档:

I've been trying to combine two XML documents like this:

$def  = new DOMDocument( '1.0' );
$rdef = new DOMDocument( '1.0' );
$def->load( $path );
$rdef->loadXML( $info );
$r = $def->getElementsByTagName( 'repository' )->item( 0 );
$s = $rdef->getElementsByTagName( 'repository' )->item( 0 );
try {
    $r->appendChild( $s );
}
catch ( DOMException $e ) {
    SPConfig::debOut( get_class( $s ) );
    SPConfig::debOut( $e->getMessage() );
}

结果是:

DOMElement
Wrong Document Error

所以在我看来, $ rdef-> getElementsByTagName('repository') - > item(0)返回 DOMElement 对象,而定义说应该是 DOMNode 对象。

So it seems to me that $rdef->getElementsByTagName( 'repository' )->item( 0 ) returns DOMElement object but the definition says it should be DOMNode object.

任何想法有什么问题?

推荐答案

没有任何错误。 DOMNodeList可以容纳任何DOMNode实例或其子类。 DOMElement扩展了DOMNode,所以在技术上,DOMElement 也是一个 DOMNode。相同的DOMAttr。

Nothing wrong about it. DOMNodeList can hold any DOMNode instances or subclasses thereof. DOMElement extends DOMNode, so technically a DOMElement is a DOMNode as well. Same for DOMAttr.

编辑:问题是您尝试复制到其他DOMDocument。您必须 importNode 节点进入文档,然后再附加。

The problem is you trying to copy into the other DOMDocument. You have to importNode the node into the Document first, before appending it.

EDIT2:尝试这样:

Try this please:

$r = $def->getElementsByTagName( 'repository' )->item( 0 );
$s = $rdef->getElementsByTagName( 'repository' )->item( 0 );
$i = $def->importNode( $s, TRUE );
$r->appendChild( $i , TRUE );

EDIT3:完整示例

Full example

$srcXML = <<< XML
<repositories>
    <repository>
        <element>foo</element>
    </repository>
</repositories>
XML;

$destXML = <<< XML
<repositories>
    <repository>
        <element>bar</element>
    </repository>
</repositories>
XML;

$srcDoc  = new DOMDocument;
$destDoc = new DOMDocument;
$destDoc->formatOutput = TRUE;
$destDoc->preserveWhiteSpace = FALSE;

$srcDoc->loadXML( $srcXML );
$destDoc->loadXML( $destXML );

$destNode = $destDoc->getElementsByTagName('repository')->item( 0 );
$srcNode  = $srcDoc->getElementsByTagName('repository')->item( 0 );
$import   = $destDoc->importNode($srcNode, TRUE);
$destNode->parentNode->appendChild($import);
echo $destDoc->saveXML();

<?xml version="1.0"?>
<repositories>
  <repository>
    <element>bar</element>
  </repository>
  <repository>
    <element>foo</element>
  </repository>
</repositories>

这篇关于将DOMNodes从一个DOMDocument复制到另一个DOMDocument的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆