【问题标题】:Use DOM and XPath to remove a node from a sitemap file使用 DOM 和 XPath 从站点地图文件中删除节点
【发布时间】:2011-06-12 18:46:52
【问题描述】:

我正在尝试开发一个从我的站点地图文件中删除某些 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 计数为 '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;
}

而且它没有返回任何东西。

我尝试更进一步并使用键盘,使用提到的另一篇文章中使用的内容,然后这样做:

<?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(): Invalid expression”。感谢您对 urlset 的其他评论,我一定会在我的代码中包含双斜杠,尝试过它并没有返回任何内容。

【问题讨论】:

  • $urlDOMNodelist 不是 DOMElement?并且列表不能被移除,也许你需要遍历列表并移除每个元素?
  • 我不懂 jakenoble。您认为我之前的代码通过 XML 运行并将所有 loc 节点与 php 变量进行比较是正确的方法吗?也许我现在的代码有问题?
  • @ctrygstad 我向您指出另一个问题的原因是因为它显示了如何实际删除节点。您的示例中缺少该部分。这并不是要建议更改您的 XPath。如果不查看您的 XML,我们无法告诉您 XPath 是否正确。
  • @Gordon:我同意。从概念上讲,这是对命名空间问题的重复。

标签: php dom xpath


【解决方案1】:

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

我在临睡前写出记忆不足的东西。如果还是不行,我明天早上去测试。 (是的,我知道这可能会带来一些反对意见)

如果你没有命名空间(你应该有,但这不是义务sigh

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

你有一个具体的例子,它在这里工作:http://codepad.org/vuGl1MAc

【讨论】:

  • 谢谢!这很完美,不知道你必须声明一个命名空间。我确实在我的 sitemap.xml 文件中声明了一个命名空间以供记录。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2021-05-30
  • 2012-07-20
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多