php:dom从另一个dom的根节点替换节点

时间:2016-05-20 11:47:36

标签: php dom replace

我需要从其他文档的整个节点更新节点:

原始XML:

<a>
<b>Bat</b>
</a>

我希望输出:

<a>
<b>bi</b>
</a>

首次尝试:替换为documentfragment

    $original = "<a>
    <b>Bat</b>
    </a>";
    $replace = "<b>Bi</b>";

    $dom = new DOMDocument('1.0', 'utf-8');
    $dom->loadXML($original);

    $xpath = new DOMXpath($dom);
    $b = $xpath->query('//b')->item(0);

    $fragment = $dom->createDocumentFragment();
    $fragment->appendXML($replace);

    $dom->replaceChild($fragment, $b);

    echo $dom->saveXML();

ERROR:

  

致命错误:未捕获的异常&#39; DOMException&#39;消息&#39;未找到   错误&#39;在/home/zital/scripts/php/dom.php:17堆栈跟踪:

     

0 /home/zital/scripts/php/dom.php(17):DOMNode-&gt; replaceChild(Object(DOMDocumentFragment),Object(DOMElement))

     在第17行的/home/zital/scripts/php/dom.php中抛出

1 {main}

第二次尝试:通过导入节点替换

$original = "<a>
        <b>Bat</b>
</a>";
$replace = "<b>Bi</b>";

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadXML($original);

$xpath = new DOMXpath($dom);
$b = $xpath->query('//b')->item(0);

$dom2 = new DOMDocument('1.0', 'utf-8');
$dom2->loadXML($replace);

$replace = $dom2->documentElement;
$replace = $dom->importNode($replace, true);

$dom->replaceChild($replace, $b);

echo $dom->saveXML();

ERROR:

  

致命错误:未捕获的异常&#39; DOMException&#39;消息&#39;未找到   错误&#39;在/home/zital/scripts/php/dom.php:42堆栈跟踪:

     

0 /home/zital/scripts/php/dom.php(42):DOMNode-&gt; replaceChild(Object(DOMElement),Object(DOMElement))

     在第42行的/home/zital/scripts/php/dom.php中抛出

1 {main}

1 个答案:

答案 0 :(得分:1)

你没有再做一步来获取documentElement

$dom->documentElement->replaceChild($replace, $b);

,结果将是

<?xml version="1.0"?>
<a><b>Bi</b></a>

UPD:

按照Yoshi评论的相当正确的说法,最好以这种方式写这个

$b->parentNode->replaceChild($replace, $b);