Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP使用dom删除多个元素_Php_Xml_Domdocument - Fatal编程技术网

PHP使用dom删除多个元素

PHP使用dom删除多个元素,php,xml,domdocument,Php,Xml,Domdocument,我试图使用DOM文档删除php中的多个元素,但它并没有按照我希望的那样工作 <iPhone> <enAttentePush> <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID> <Message>someDataHere</Message> </enAttentePush> <enAttente

我试图使用DOM文档删除php中的多个元素,但它并没有按照我希望的那样工作

<iPhone>
<enAttentePush>
  <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID>
  <Message>someDataHere</Message>
</enAttentePush>

<enAttentePush>
  <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID>
  <Message>someDataHere</Message>
</enAttentePush>
</iPhone>
它只删除一个节点,通常是最后一个节点

如何循环我的节点并在每次看到节点时将其删除


非常感谢。

我最近不得不在我自己的网站上这样做,发现如果你将元素排成一个数组,你可以很容易地将它们全部删除。下面是一个使用的小片段,希望它能帮助您:

$doc = new DOMDocument;

$doc->load('$myFile');
$domNodeList = $doc->getElementsByTagName('enAttentePush');

$domArray = array(); //set up an array to catch all our nodes

foreach($domNodeList as $dom) {
    $domArray[] = $dom;
}

// loop through the array and delete each node
foreach($domArray as $node){ 
    $doc->documentElement->removeChild($node);
}

$doc->save('$myFile');

我最近在我自己的网站上做了这件事,发现如果你把元素排成一个数组,你可以很容易地把它们全部删除。下面是一个使用的小片段,希望它能帮助您:

$doc = new DOMDocument;

$doc->load('$myFile');
$domNodeList = $doc->getElementsByTagName('enAttentePush');

$domArray = array(); //set up an array to catch all our nodes

foreach($domNodeList as $dom) {
    $domArray[] = $dom;
}

// loop through the array and delete each node
foreach($domArray as $node){ 
    $doc->documentElement->removeChild($node);
}

$doc->save('$myFile');
getElementsByTagName()
返回“live”迭代器,当您从列表中删除元素时,列表将发生更改。您可以将迭代器转换为数组以获取列表的副本

$xml = <<<'XML'
<iPhone>
<enAttentePush>
  <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID>
  <Message>someDataHere</Message>
</enAttentePush>
<enAttentePush>
  <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID>
  <Message>someDataHere</Message>
</enAttentePush>
</iPhone>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);

$nodes = iterator_to_array($dom->getElementsByTagName('enAttentePush'));
foreach ($nodes as $node) {
  $node->parentNode->removeChild($node);
}

echo $dom->saveXml();
getElementsByTagName()
返回“live”迭代器,当您从列表中删除元素时,列表将发生更改。您可以将迭代器转换为数组以获取列表的副本

$xml = <<<'XML'
<iPhone>
<enAttentePush>
  <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID>
  <Message>someDataHere</Message>
</enAttentePush>
<enAttentePush>
  <UDID>dd6fc8032f0bf4c4b3a9c60f523900c9ad463b620a83b6473eda9a12b2c9d47f</UDID>
  <Message>someDataHere</Message>
</enAttentePush>
</iPhone>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);

$nodes = iterator_to_array($dom->getElementsByTagName('enAttentePush'));
foreach ($nodes as $node) {
  $node->parentNode->removeChild($node);
}

echo $dom->saveXml();

如注释中所述,使用
while
而不是
foreach
迭代DOMNodeList:

$i = $domNodeList->length;
while ($i > 0) {
    $i--;
    $domElement = $domNodeList->item($i);
    $domElement->parentNode->removeChild($domElement); 
}

如注释中所述,使用
while
而不是
foreach
迭代DOMNodeList:

$i = $domNodeList->length;
while ($i > 0) {
    $i--;
    $domElement = $domNodeList->item($i);
    $domElement->parentNode->removeChild($domElement); 
}

如果我模糊地回忆起来,删除节点会打乱节点查询,这意味着您必须重新查询DOM,直到删除所有节点。因此,不要使用<代码>前缀({}} /代码>),您应该考虑使用<代码>(){{}{代码}。好吧,我不知道如何用DOM做一个while循环……如果我模糊地记得,删除一个节点会扰乱节点查询,这意味着您必须重新查询DOM,直到所有节点都被删除。因此,代替<代码>前缀({ } )应该考虑使用<代码>(){{}{代码}。好吧,我不知道如何用DOM做一个while循环……非常感谢,我将使用STKCHIBON解决方案,这对于像我这样的NoOB来说更为简单,但是您的回答帮助了我很多,我将看一看“XPath”。非常感谢,非常感谢。非常感谢。我将使用stckrboy解决方案,这对于像我这样的noob来说更简单,尽管你的回答帮助了我很多,我将看一看@xPath。非常感谢,非常感谢。
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$nodes = $xpath->evaluate('/*/enAttentePush');
foreach ($nodes as $node) {
  $node->parentNode->removeChild($node);
}

echo $dom->saveXml();
$i = $domNodeList->length;
while ($i > 0) {
    $i--;
    $domElement = $domNodeList->item($i);
    $domElement->parentNode->removeChild($domElement); 
}