【问题标题】:DOMElement cloning and appending: 'Wrong Document Error'DOMElement 克隆和附加:“错误的文档错误”
【发布时间】:2010-12-18 01:33:27
【问题描述】:

关于使用 PHP 的 DOM api 进行节点克隆,我还没有完全理解。这是一个快速复制我遇到的问题的示例文件。

$doc  = new DOMDocument( '1.0', 'UTF-8' );
$root = $doc->createElement( 'root' ); // This doesn't work either $root = new DOMElement( 'root' );
$doc->appendChild( $root );

$doc2  = new DOMDocument( '1.0', 'UTF-8' );
$root2 = $doc2->createElement( 'root2' );
$doc2->appendChild( $root2 );

// Here comes the error
$root2->appendChild( $root->cloneNode() );

当你运行这个小 sn-p 时会抛出异常

致命错误:未捕获的异常 带有消息“错误”的“DOMException” 文档错误'

我不能从一个文档中抓取一个节点,克隆它,然后将它附加到另一个文档吗?

【问题讨论】:

    标签: php xml dom domdocument


    【解决方案1】:

    使用DOMDocument->importNode 将节点导入到另一个文档中,然后再将其添加到 DOM。

    【讨论】:

    • 完美,谢谢。我正在搜索DOMNodeDOMElement API,寻找可以让我这样做的东西,并且(愚蠢地)从未检查过DOMDocument 方法=/
    • 你在哪里添加了importNode?我将它添加到我的代码中,但仍然出现错误。
    • @NobleUplift 您需要调用importNode 将节点从一个文档导入到另一个文档。之后,您可以将其作为孩子附加到您想要的位置。
    • 我正在处理深度嵌套的标签,所以我需要调用 $parent->ownerDocument->importNode($child, true) 然后才能添加它。
    【解决方案2】:

    您必须将importNode 方法的结果附加到DOM。请记住,该方法在无法导入时可能返回 false

    if ($importedNode = $doc2->importNode($root->cloneNode())) {
        $root2->appendChild($importedNode);
    }
    

    如果您需要导入节点,它的所有子节点(递归地)和/或节点的属性使用可选的第二个参数deep

    if ($importedNode = $doc2->importNode($root->cloneNode(), true)) {
        $root2->appendChild($importedNode);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多