PHP XML节点删除

PHP XML节点删除,php,xml,dom,Php,Xml,Dom,我有一个包含大量标记的XML文件。它到处都有2000多个标签。我想删除所有htmlText标记并将其另存为新的xml。我是如何用PHP实现的??? 这是我使用的代码 $remove = $doc->getElementsByTagName('htmlText'); $doc->removeChild($remove); 这两种解决方案应该有效: $elements = $doc->getElementsByTagName('htmlText'); while ($elemen

我有一个包含大量标记的XML文件。它到处都有2000多个标签。我想删除所有htmlText标记并将其另存为新的xml。我是如何用PHP实现的??? 这是我使用的代码

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

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

$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();
$doc=newDOMDocument();
$doc->loadHTML('第一个

第二个

第三个

'); foreach($doc->getElementsByTagName('p')作为$el){ $el->parentNode->removeChild($el); } echo$doc->saveHTML();

这里,节点列表包含3个元素:0=>first、1=>second、2=>third。如果运行它,您将看到第二个元素没有被删除,因为第一次迭代删除了索引0(“first”)处的元素,节点列表只剩下2个元素(0=>second,1=>third)。下一次迭代将删除索引1(第三个)处的元素,循环结束。如果保存文档,您会发现第二个元素保持不变。这可能就是你在前面的建议中说“它只删除了其中的一些”时所经历的情况。

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

$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();
$doc=newDOMDocument();
$doc->loadHTML('第一个

第二个

第三个

'); foreach($doc->getElementsByTagName('p')作为$el){ $el->parentNode->removeChild($el); } echo$doc->saveHTML();
这里,节点列表包含3个元素:0=>first、1=>second、2=>third。如果运行它,您将看到第二个元素没有被删除,因为第一次迭代删除了索引0(“first”)处的元素,节点列表只剩下2个元素(0=>second,1=>third)。下一次迭代将删除索引1(第三个)处的元素,循环结束。如果保存文档,您会发现第二个元素保持不变。这可能就是你在前面的建议中说“它只删除了其中的一部分”时所经历的