鉴于此标记
<badtag>
This is the title and <em>really</em> needs help
<badtag>
我需要删除包装器,但是在不丢失标签的情况下执行此操作,如果我只是执行以下操作会发生这种情况:
dom->createTextNode(currentNode->nodeValue)
我已经尝试了以下方法,但它并不是很有效,我想确保我走上正轨并且不会错过更简单的方法。我注意到,当我在switch语句(而不是#text)中点击标记时,我需要添加迭代,以便获取标记的内容(例如使用标记)。
$l = $origElement->childNodes->length;
$new = [];
for ($i = 0; $i < $l; ++$i) {
$child = $origElement->childNodes->item($i);
switch ($child->nodeName) {
case '#text':
$new[] = $dom->createTextNode($origElement->textContent);
break;
default:
$new[] = $child;
break;
}
}
foreach ($new as $struct) {
$parentNode->insertBefore($struct, $origElement);
}
$origElement->parentNode->removeChild($origElement);
答案 0 :(得分:3)
我创建了一些内容,可以创建要删除的节点内容的克隆。它似乎不喜欢只移动节点,而当我使用cloneNode
代替时,新版本似乎更清晰。
<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );
$xml = <<<EOB
<DATA>
<badtag>
This is the title and <em>really</em> needs help
</badtag>
</DATA>
EOB;
$dom = new DOMDocument();
$dom->loadXML($xml);
$origElement = $dom->getElementsByTagName("badtag")[0];
$newParent = $origElement->parentNode;
foreach ( $origElement->childNodes as $child ){
$newParent->insertBefore($child->cloneNode(true), $origElement);
}
$newParent->removeChild($origElement);
echo $dom->saveXML();
对于我使用的小样本,输出是......
<?xml version="1.0"?>
<DATA>
This is the title and <em>really</em> needs help
</DATA>