gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:05:53 24 4
gpt4 key购买 nike

我正在尝试开发一个从站点地图文件中删除某些 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(): 无效表达式”。感谢您对 urlset 的其他评论,我一定会在我的代码中包含双斜杠,尝试了一下,但它什么也没返回。

最佳答案

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

我在 sleep 前写的记不清了。如果不行我明天早上就去测试。 (是的,我知道这可能会带来一些反对票)

如果您没有命名空间(您应该有,但这不是义务叹息)

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

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

关于php - 使用 DOM 和 XPath 从站点地图文件中删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com