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.

War es hilfreich?

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top