我需要从其他文档的整个节点更新节点:
原始XML:
<a>
<b>Bat</b>
</a>
Run Code Online (Sandbox Code Playgroud)
我想要的输出:
<a>
<b>bi</b>
</a>
Run Code Online (Sandbox Code Playgroud)
第一次尝试:替换为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();
Run Code Online (Sandbox Code Playgroud)
错误:
致命错误:/home/zital/scripts/php/dom.php:17中未捕获的异常'DOMException',消息'未找到错误'堆栈跟踪:
0 /home/zital/scripts/php/dom.php(17):DOMNode-> 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();
Run Code Online (Sandbox Code Playgroud)
错误:
致命错误:/home/zital/scripts/php/dom.php:42中未捕获的异常'DOMException',消息'未找到错误'堆栈跟踪:
0 /home/zital/scripts/php/dom.php(42):DOMNode-> replaceChild(Object(DOMElement),Object(DOMElement))
在第42行/home/zital/scripts/php/dom.php中抛出1 {main}
您没有再采取任何步骤来获取 documentElement
$dom->documentElement->replaceChild($replace, $b);
Run Code Online (Sandbox Code Playgroud)
结果将是
<?xml version="1.0"?>
<a><b>Bi</b></a>
Run Code Online (Sandbox Code Playgroud)
更新:
根据相当正确的 Yoshi 评论,最好这样写
$b->parentNode->replaceChild($replace, $b);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
154 次 |
最近记录: |