PHP XML节点删除

时间:2009-06-18 06:41:39

标签: php xml dom

我有一个包含大量标签的XML文件。它有超过2000个标签。我想删除所有htmlText标签并将其保存为新的xml。怎么能在PHP中做到这一点??? 这是我使用的代码

$remove = $doc->getElementsByTagName('htmlText');
$doc->removeChild($remove);

1 个答案:

答案 0 :(得分:4)

这两种解决方案应该有效:

$elements = $doc->getElementsByTagName('htmlText');
while ($elements->length > 0) {
  $elements->item(0)->parentNode->removeChild($elements->item(0));
}

或向后循环

$elements = $doc->getElementsByTagName('htmlText');
for ($i = $elements->length-1; $i >= 0; $i--) {
    $elements->item($i)->parentNode->removeChild($elements->item($i));
}

如前所述使用foreach,或从0开始循环,将无效,因为循环时节点列表会发生变化。您可以使用以下代码段对此进行测试:

$doc = new DOMDocument();
$doc->loadHTML('<p>first</p><p>second</p><p>third</p>');
foreach ($doc->getElementsByTagName('p') as $el) {
    $el->parentNode->removeChild($el);
}
echo $doc->saveHTML();

此处节点列表包含3个元素:0 =&gt; first,1 =&gt; second,2 =&gt; third。如果你运行它,你会看到第二个元素没有被删除,因为第一个迭代删除索引0('first')的元素,只留下2个元素的节点列表(0 =&gt; second,1 =&gt; third )。下一次迭代将删除索引1(第三个)处的元素,并且循环结束。如果您随后保存文档,您将发现第二个元素保持不变。当你说“它只删除其中一些”时,你可能会遇到这种情况。