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