2011-01-20 3 views
1

Я пытаюсь разработать функцию, которая удаляет определенные узлы URL из моего файла Sitemap. Вот что я до сих пор.Используйте DOM и XPath для удаления узла из файла 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; 
} 

И его не возвращающегося ничего.

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

<?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 :: запрос() : Недопустимое выражение "в строке цикла foreach. Спасибо за другой комментарий по urlset, я обязательно включу двойные косые черты в моем коде, попробовал бы это и ничего не вернул.

+0

Возможный дубликат [удалить дочерний узел в файле xml с php] (http://stackoverflow.com/questions/4667433/delete-child-node-in-xml-file-with -php) – Gordon

+0

'$ url' является' DOMNodelist' не 'DOMElement'? И список не может быть удален, возможно, вам нужно перебрать список и удалить каждый элемент? –

+0

Не понимаю jakenoble. Считаете ли вы, что код, который у меня был до этого, прошел через XML и сравнил все узлы loc с переменной php, был правильным путем? Может, у меня есть ошибочный код так, как сейчас? – ctrygstad

ответ

9

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

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

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

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

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

+0

Спасибо! Это сработало отлично, не знало, что вам нужно объявить пространство имен. У меня есть пространство имен, объявленное в файле sitemap.xml для записи. – ctrygstad

Смежные вопросы