Используйте DOM и XPath для удаления узла из файла карты сайта - PullRequest
1 голос
/ 21 января 2011

Я пытаюсь разработать функцию, которая удаляет определенные узлы 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, если количество элементов $ равно 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, я обязательно включу двойную косую черту в мой код, попробовал и ничего не вернулось.

1 Ответ

11 голосов
/ 21 января 2011

XML из карты сайта должен иметь вид:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...