我正在尝试开发一个从我的站点地图文件中删除某些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上的其他评论,我肯定会在我的代码中包含双斜杠,尝试它并且它什么也没有返回。
答案 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