Verwenden Sie DOM-und XPath-zum entfernen von Knoten aus einer XML-sitemap-Datei
Ich versuche mich zu entwickeln, eine Funktion, die entfernt bestimmte URL-Knoten aus meiner XML-sitemap-Datei. Hier ist was ich habe, so weit.
$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;
}
Welche Ausgänge "111111". Ich weiß nicht, warum ich kann nicht echo einen string in einer foreach-Schleife, wenn $Elemente zählen ist '1'.
Bis jetzt, ich habe zu tun
$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);
}
}
Welche würde funktionieren, wenn meine sitemap noch nicht so groß war. Es mal aus, gerade jetzt, so hoffe ich, dass ich mit xpath-Abfragen werden schneller.
Nach Gordon ' s Kommentar habe ich versucht:
$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;
}
Und seine Rückkehr nicht alles.
Versuchte ich noch einen Schritt weiter und verwendet codepad, die mit dem, was verwendet wurde, in dem anderen post erwähnt, und Tat dies:
<?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();
und ich bin immer ein "Warning: DOMXPath::query(): Ungültiger Ausdruck" auf die foreach-Schleife Linie. Danke für die anderen Kommentar über die urlset, ich werde sicher sein, um die Doppel-slashes in meinem code, habe es ausprobiert und wieder nichts.
$url
ist ein DOMNodelist
kein DOMElement
? Und die Liste kann nicht entfernt werden, vielleicht musst du die Liste Durchlaufen und entfernen Sie jedes element?Ich verstehe nicht, jakenoble. Denken Sie, dass der code, den ich vorher hatte, lief durch die XML-und im Vergleich alle loc-Knoten, um die php-variable war der richtige Weg zu gehen? Vielleicht habe ich fehlerhaften code in der Art ist es jetzt?
der Grund, warum ich wies Sie an, die andere Frage ist, weil es zeigt, wie Sie tatsächlich entfernen Sie die Knoten. Dieser Teil fehlt in deinem Beispiel. Es war nicht gemeint zu empfehlen, ändern Sie Ihre XPath. Wir können nicht sagen, wenn Ihr XPath korrekt ist, ohne zu sehen, Ihre XML.
Ich bin damit einverstanden. Konzeptionell ist es eine doppelte disriggarding die namespace-Problem.
InformationsquelleAutor ctrygstad | 2011-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
XML-Code aus einer XML-sitemap sollte sein :
Da wurde es ein namespace, die Abfrage ist ein wenig komplizierter als meine bisherige Antwort :
ich Schreibe aus der Erinnerung, kurz bevor Sie zu Bett gehen. Wenn es nicht funktioniert gehen ich werde den test morgen früh. (Und ja, ich bin mir bewusst, dass es bringen könnte einige downvotes)Wenn Sie nicht über einen namespace (Sie sollten aber nicht die Verpflichtung Seufzer)
Haben Sie ein konkretes Beispiel, dass es funktioniert, hier : http://codepad.org/vuGl1MAc
InformationsquelleAutor Shikiryu