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() );
}
Run Code Online (Sandbox Code Playgroud)
结果是:
DOMElement
Wrong Document Error
Run Code Online (Sandbox Code Playgroud)
所以在我看来,$rdef->getElementsByTagName( 'repository' )->item( 0 )返回DOMElement对象但定义说它应该是DOMNode对象。
知道它有什么问题吗?
没什么不对的。DOMNodeList 可以保存任何 DOMNode 实例或其子类。DOMElement 扩展了 DOMNode,因此从技术上讲,DOMElement也是DOMNode。DOMAttr 也是如此。
编辑:问题是您试图复制到另一个 DOMDocument 中。importNode在附加之前,您必须先将节点放入文档中。
EDIT2:请试试这个:
$r = $def->getElementsByTagName( 'repository' )->item( 0 );
$s = $rdef->getElementsByTagName( 'repository' )->item( 0 );
$i = $def->importNode( $s, TRUE );
$r->appendChild( $i , TRUE );
Run Code Online (Sandbox Code Playgroud)
EDIT3:完整示例
$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();
Run Code Online (Sandbox Code Playgroud)
给
<?xml version="1.0"?>
<repositories>
<repository>
<element>bar</element>
</repository>
<repository>
<element>foo</element>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4015 次 |
| 最近记录: |