2011-01-20 82 views
1

我想開發一個功能,從我的站點地圖文件中刪除某些URL節點。這是我到目前爲止。使用DOM和XPath從站點地圖文件中刪除節點

$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」。我不知道爲什麼我無法在foreach循環中回顯字符串,如果$元素計數是'1'。

到現在爲止,我一直在做

$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(); 

,我得到一個「警告:DOMXPath ::查詢() :無效表達式「在foreach循環行。感謝對urlset的其他評論,我將確保在我的代碼中包含雙斜線,嘗試它並且它不返回任何內容。

+0

可能的重複[刪除PHP文件中的子節點與PHP](http://stackoverflow.com/questions/4667433/delete-child-node-in-xml-file-with -php) – Gordon 2011-01-20 21:43:09

+0

`$ url`是DOMNodelist而不是`DOMElement`?該列表不能被刪除,也許你需要遍歷列表並刪除每個元素? – 2011-01-20 21:54:13

回答

9

從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