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

Php 使用DOM和XPath从站点地图文件中删除节点,php,dom,xpath,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

我正在尝试开发一个从我的站点地图文件中删除某些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;
}
而且它什么也不退

我尝试更进一步,使用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();

专业服务
5专业服务
6专业服务
XML;
$id='5专业服务';
$dom=新的DOMDocument$dom->loadXML($xml);
$xpath=newdomxpath($dom)$query=sprintf('/url/[loc=$id]');
foreach($xpath->query($query)作为$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>
就在睡觉前,我记忆犹新。如果不行,我明天早上就去考试。(是的,我知道这可能会带来一些负面影响)

如果您没有名称空间(您应该这样做,但这不是义务)


这里有一个具体的例子说明它的作用:

来自站点地图的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>
就在睡觉前,我记忆犹新。如果不行,我明天早上就去考试。(是的,我知道这可能会带来一些负面影响)

如果您没有名称空间(您应该这样做,但这不是义务)


这里有一个具体的例子:

可能重复的
$url
域节点列表
而不是
域元素
?这个列表不能被删除,也许你需要遍历这个列表并删除每个元素?我不明白。您认为我之前的代码通过XML运行并将所有loc节点与php变量进行比较是正确的方法吗?也许我现在的代码有问题?@ctrygstad我给你指出另一个问题的原因是因为它展示了如何实际删除节点。您的示例中缺少该部分。这并不是要建议更改XPath。如果没有看到XML,我们无法告诉您XPath是否正确。@Gordon:我同意。从概念上讲,这是一个重复的名称空间问题。可能重复的
$url
是一个
DOMNodelist
而不是
DOMElement
?这个列表不能被删除,也许你需要遍历这个列表并删除每个元素?我不明白。您认为我之前的代码通过XML运行并将所有loc节点与php变量进行比较是正确的方法吗?也许我现在的代码有问题?@ctrygstad我给你指出另一个问题的原因是因为它展示了如何实际删除节点。您的示例中缺少该部分。这并不是要建议更改XPath。如果没有看到XML,我们无法告诉您XPath是否正确。@Gordon:我同意。从概念上讲,这是一个重复的名称空间问题。谢谢!这工作得很好,不知道必须声明名称空间。我确实在我的sitemap.xml文件中声明了一个名称空间作为记录。谢谢!这工作得很好,不知道必须声明名称空间。我确实在我的sitemap.xml文件中声明了一个名称空间作为记录。
$elements = $xpath->query('/urlset/url[loc = "'.$pageUrl.'"]');