Löschen Sie alle Elemente eines bestimmten Typs aus einem XML-Dokument mit PHP
Frage
Ich habe, was sollte eine einfache Aufgabe: Löschen <places>
Knoten und deren Nachkommen aus einem XML-Dokument, so dass andere Knoten
habe ich versucht, diesen Code, aber es hat nicht funktioniert ...
$document->preserveWhiteSpace = false;
$books = $xpath->query('piletilve_info/places');
//echo "4";
foreach ($books as $places) {
while($places->hasChildNodes()) {
$places->removeChild($places->childNodes->item(0));
}
$places->parentNode->removeChild($places);
}
Quelle XML verarbeitet werden:
<piletilve_info>
<places>
<place>
...
</place>
</places>
<other node>
...
</other node>
</piletilve_info>
In den aktuellen Daten gibt es mehr Knoten, die nicht Orte sind, aber der Einfachheit halber zeigt dieses Beispiel nur einige zu nennen.
Ich sah # Beispiele C, aber ich schaffte es nicht in den Hafen Code zu PHP.
Klarstellung : im Code-Schnipsel, die Variable $books
ist nur ein Halter für die abgefragte Liste. Der Name hat keine Bedeutung.
Lösung
Ziel ist ganz Knoten verlassen anderen Knoten zu löschen (tatsächlich gibt es mehr, aber der Einfachheit halber Dieses Beispiel zeigt alle
$dom = new DOMDocument;
$dom->load('places.xml');
foreach ($dom->getElementsByTagName('places') as $places)
{
$places->parentNode->removeChild($places);
}
echo $dom->saveXml();
alle <places>
Elemente überall in dem Dokument entfernen, einschließlich der Kinder.
Ausgabe:
<?xml version="1.0"?>
<piletilve_info>
<other>
...
</other>
</piletilve_info>
Andere Tipps
Als ich die akzeptierte Antwort wurde mit wäre es nicht alle Vorkommen des Tags entfernen. Die foreach-Schleife würde Tags überspringen wahrscheinlich, weil foreach auf dem internen Arrayzeiger stützt und es innerhalb der Schleife führt zu unerwartetem Verhalten zu ändern.
Eine Arbeitslösung, dass ich wie folgt aussieht gefunden haben.
$dom = new DOMDocument;
$dom->load('places.xml');
$placesNodes = $dom->getElementsByTagName('places')
while ($placesNodes->length > 0) {
$node = $placesNodes->item(0);
$node->parentNode->removeChild($node);
}
echo $dom->saveXml();