Intereting Posts

Используйте DOM и XPath для удаления узла из файла Sitemap

Я пытаюсь разработать функцию, которая удаляет определенные узлы URL из моего файла Sitemap. Вот что я до сих пор.

$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; } 

Какие выходы «111111». Я не знаю, почему я не могу повторить строку в цикле foreach, если число $ elements равно '1'.

До сих пор я занимался

 $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); } } 

Это будет нормально работать, если карта сайта не будет такой большой. Это время, прямо сейчас, поэтому я надеюсь, что использование запросов xpath будет быстрее.

После комментария Гордона я попытался:

 $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; } 

И он ничего не возвращает.

Я попытался сделать шаг дальше и использовать кодовое слово, используя то, что было использовано в другом упомянутом сообщении, и сделал следующее:

 <?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(); 

и я получаю «Предупреждение: DOMXPath :: query (): Недопустимое выражение» в строке цикла foreach. Спасибо за другой комментарий по urlset, я обязательно включу двойные косые черты в моем коде, попробовал бы это и ничего не вернул.

XML из файла Sitemap должен быть:

 <?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> 

Поскольку он получил пространство имен, запрос немного сложнее, чем мой предыдущий ответ:

 $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(); 

Я пишу из памяти перед сном. Если это не сработает, завтра я пойду завтра. (И да, я знаю, что это может принести некоторые downvotes)

Если у вас нет пространства имен (вы должны, но это не обязательство вздох )

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

У вас есть конкретный пример того, что он работает здесь: http://codepad.org/vuGl1MAc