使用DOM和XPath从站点地图文件中删除节点

时间:2011-01-20 21:41:00

标签: php dom xpath

我正在尝试开发一个从我的站点地图文件中删除某些URL节点的功能。这是我到目前为止所拥有的。

$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”。如果$ elements count为'1',我不知道为什么我不能在foreach循环中回显字符串。

到目前为止,我一直在做

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

我在foreach循环线上得到一个“警告:DOMXPath :: query():无效的表达式”。感谢urlset上的其他评论,我肯定会在我的代码中包含双斜杠,尝试它并且它什么也没有返回。

1 个答案:

答案 0 :(得分:11)

站点地图中的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