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