私のサイトマップファイルから特定の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に関する他のコメントをありがとう、私は自分のコードに二重スラッシュを含めるようにして、それを試して、それは何も戻ってきません。サイトマップから
[xmlファイルの子ノードをPHPで削除する](http://stackoverflow.com/questions/4667433/delete-child-node-in-xml-file-with) -php) – Gordon
'$ url'は' DOMNodelist'で、 'DOMElement'ではありませんか?リストを削除することはできません。リストを繰り返し処理して各要素を削除する必要がありますか? –
私はjakenobleを理解できません。これまで私が使っていたコードはXMLを使い、すべてのlocノードをphp変数と比較するのが正しい方法だったと思いますか?たぶん、私はそれが現在の方法で欠陥のあるコードを持っていますか? – ctrygstad