XML XML remove element e tutti i bambini per nome

Ho un file XML strutturato come:

<root> <featured> <title></title> <tweet></tweet> <img></img> </featured> </root> 

L'elemento viene aggiunto dynamicmente, l'utente ha bisogno dell'opzione per rimuovere l'elemento in determinate occasioni,

Ho provato alcune varianti di codice tra cui:

  $featureddel = $xpath->query('//featured'); while ( $featureddel->hasChildNodes()){ $featureddel->removeChild($featureddel->childNodes->item(0)); } 

che mi dà un errore:

 PHP Fatal error: Call to undefined method DOMNodeList::hasChildNodes() 

Ho anche provato:

 $featureddel= $dom->getElementsByTagName('featured'); $featureddel->parentNode->removeChild($featureddel); 

che restituisce:

 PHP Fatal error: Call to a member function removeChild() on a non-object 

Sia DOMElement::getElementsByTagName e DOMXPath::query restituiscono un DOMNodeList . Il tuo codice sembra invece prevedere un singolo DOMNode . Prova questo:

 $featureddel = $xpath->query('//featured'); // OR: // $featuredde1 = $dom->getElementsByTagName('featured'); foreach ($featuredde1 as $node) { $node->parentNode->removeChild($node); } 

Modifica : questo codice esatto funziona come previsto per me (PHP 5.3, Debian Squeeze):

 <?php $xml = '<root> <featured> <title></title> <tweet></tweet> <img></img> </featured> </root>'; $dom = new DOMDocument(); $dom->loadXML($xml); $featuredde1 = $dom->getElementsByTagName('featured'); foreach ($featuredde1 as $node) { $node->parentNode->removeChild($node); } echo $dom->saveXML(); 

L'output è:

 <?xml version="1.0"?> <root> </root> 

Questo dovrebbe farlo:

 foreach ($featureddel as $node) { $node->parentNode->removeChild($node); } 

Probabilmente ti stai semplicemente dimenticando che con xPath e getElementsByTagName ottieni una list ( DOMNodeList ) di elementi. L'object stesso ha solo una properties; $length , che è ansible utilizzare per determinare quanti oggetti sono presenti nell'elenco e l' item($index) function item($index) , che restituisce il DOMNode specificato dall'elenco. DOMNodeList è anche iterabile tramite foreach . Quindi oltre a foreach come ho scritto sopra puoi anche fare:

 for ($i = 0; $i < $featureddel->length; $i++) { $temp = $featureddel->item($i); //avoid calling a function twice $temp->parentNode->removeChild($temp); } 

Ma foreach è solitamente più preferito.