【发布时间】: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 的其他评论,我一定会在我的代码中包含双斜杠,尝试过它并没有返回任何内容。
【问题讨论】:
-
$url是DOMNodelist不是DOMElement?并且列表不能被移除,也许你需要遍历列表并移除每个元素? -
我不懂 jakenoble。您认为我之前的代码通过 XML 运行并将所有 loc 节点与 php 变量进行比较是正确的方法吗?也许我现在的代码有问题?
-
@ctrygstad 我向您指出另一个问题的原因是因为它显示了如何实际删除节点。您的示例中缺少该部分。这并不是要建议更改您的 XPath。如果不查看您的 XML,我们无法告诉您 XPath 是否正确。
-
@Gordon:我同意。从概念上讲,这是对命名空间问题的重复。