2011-01-20 7 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"を出力します。 $要素数が '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(); 

と、私は「警告取得しています:DOMXPathを使うことの最大::クエリ() :無効な式 "foreachループの行で。 urlsetに関する他のコメントをありがとう、私は自分のコードに二重スラッシュを含めるようにして、それを試して、それは何も戻ってきません。サイトマップから

+0

[xmlファイルの子ノードをPHPで削除する](http://stackoverflow.com/questions/4667433/delete-child-node-in-xml-file-with) -php) – Gordon

+0

'$ url'は' DOMNodelist'で、 'DOMElement'ではありませんか?リストを削除することはできません。リストを繰り返し処理して各要素を削除する必要がありますか? –

+0

私はjakenobleを理解できません。これまで私が使っていたコードはXMLを使い、すべてのlocノードをphp変数と比較するのが正しい方法だったと思いますか?たぶん、私はそれが現在の方法で欠陥のあるコードを持っていますか? – ctrygstad

答えて

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

+0

ありがとう!それは完璧に働いて、あなたが名前空間を宣言しなければならないかどうかは分かりませんでした。私はレコードのための私のsitemap.xmlファイルで宣言された名前空間を持っています。 – ctrygstad

関連する問題