Usa DOM e XPath per rimuovere un nodo da un file Sitemap

Sto cercando di sviluppare una function che rimuova determinati nodes URL dal mio file Sitemap. Ecco cosa ho finora.

$xpath = new DOMXpath($DOMfile); $elements = $xpath->query("/urlset/url/loc[contains(.,'$pageUrl')]"); echo count($elements); foreach($elements as $element){ //this is where I want to delete the URL echo $element; echo "here".$element->nodeValue; } 

Quale output "111111". Non so perché non riesco a echo una string in un ciclo foreach se il count degli elementi $ è '1'.

Fino ad ora, ho fatto

 $urls = $dom->getElementsByTagName( "url" ); foreach( $urls as $url ){ $locs = $url->getElementsByTagName( "loc" ); $loc = $locs->item(0)->nodeValue; echo $loc; if($loc == $fullPageUrl){ $removeUrl = $dom->removeChild($url); } } 

Quale functionrebbe benissimo se il mio sitemap non fosse così grande. È scaduto in questo momento, quindi spero che l'uso delle query xpath sarà più veloce.

Dopo il commento di Gordon, ho provato:

 $xpath = new DOMXpath($DOMfile); $query = sprintf('/urlset/url[./loc = "%d"]', $pageUrl); foreach($xpath->query($query) as $element) { //this is where I want to delete the URL echo $element; echo "here".$element->nodeValue; } 

E non sta restituendo nulla.

Ho provato a fare un ulteriore passo avanti e ho usato il codepad, usando quello che era stato utilizzato nell'altro post menzionato, e ho fatto questo:

 <?php error_reporting(-1); $xml = <<< XML <?xml version="1.0" encoding="UTF-8" ?> <url> <loc>professional_services</loc> <loc>5professional_services</loc> <loc>6professional_services</loc> </url> XML; $id = '5professional_services'; $dom = new DOMDocument; $dom->loadXML($xml); $xpath = new DOMXPath($dom); $query = sprintf('/url/[loc = $id]'); foreach($xpath->query($query) as $record) { $record->parentNode->removeChild($record); } echo $dom->saveXml(); 

e ricevo un "Avviso: DOMXPath :: query (): espressione non valida" sulla linea del ciclo foreach. Grazie per l'altro commento sull'URL, includerò sicuramente le doppie barre nel mio codice, l'ho provato e non ha restituito nulla.

XML da una sitemap dovrebbe essere:

 <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc></loc> ... </url> <url> <loc></loc> ... </url> ... </urlset> 

Dal momento che ha uno spazio dei nomi, la query è un po 'più complicata della mia precedente risposta:

 $xpath = new DOMXpath($DOMfile); // Here register your namespace with a shortcut $xpath->registerNamespace('sm', "http://www.sitemaps.org/schemas/sitemap/0.9"); // this request should work $elements = $xpath->query('/sm:urlset/sm:url[sm:loc = "'.$pageUrl.'"]'); foreach($elements as $element){ // This is a hint from the manual comments $element->parentNode->removeChild($element); } echo $DOMfile->saveXML(); 

Sto scrivendo memory appena prima di andare a letto. Se non funziona, andrò a testare domani mattina. (E sì, sono consapevole che potrebbe portre qualche downvotes)

Se non hai uno spazio dei nomi (dovresti farlo ma non è un sospiro )

 $elements = $xpath->query('/urlset/url[loc = "'.$pageUrl.'"]'); 

Hai un esempio concreto che funziona qui: http://codepad.org/vuGl1MAc