Seite 1 von 1
SimpleXML: Saubere Loesung um einen XMLNode zu loeschen?
Verfasst: 17.09.2008, 10:30
von Airport1
Im Web schwirren teilweise sehr skurrile Loesungsvorschlaege herum um aus einem XML Dokument mittels einem Potpouri einfach nur einen Knoten zu loeschen.
Klar, SimpleXML ist wohl mehr fuer das Lesen von XML gedacht. Dennoch wuerde ich gerne mit SimpleXML - und am besten nur damit , da das DOM Geraffel doch recht versionsspezifisch sich teilweise ganz anders verhalten kann - einen XML Node loeschen.
Erkennungsmerkmal kann ein bestimmtes Attribut sein. Z.B. soll aus
<root>
<class name="ABC">
..
</class>
<class name="ERX">
..
</class>
</root>
der komplette Node "ERX" mittels SimpleXML geloescht werden.
Meine bisherigen Versuche dies mit unset zu bewerkstelligen schlagen leider noch fehl?
Verfasst:
von
SEO Consulting bei
ABAKUS Internet Marketing Erfahrung seit 2002
- persönliche Betreuung
- individuelle Beratung
- kompetente Umsetzung
Jetzt anfragen:
0511 / 300325-0.
Verfasst: 17.09.2008, 10:41
von Southmedia
Nicht vorgesehen, geht also nicht. Da kommste um die DOM-Funktionen nicht herum. Ist aber nicht so kompliziert und mit PHP5 sollte das auch immer gleich funktionieren.
Meine wichtigsten Bookmarks zu dem Thema:
https://debuggable.com/posts/parsing-xm ... 5acbdd56cb
https://debuggable.com/posts/parsing-xm ... dacbdd56cb
Verfasst: 17.09.2008, 10:45
von Airport1
hm, das mit dem loeschen _muss_ einfach gehen --
bei dem dom zeug rollen sich mir die fussnaegel hoch, ich _will_ (noch) nicht
habe einen funkt. workaround gefunden, der zumindest eine moeglichkeit schafft wenn man einen alten node durch neue inhalte ersetzen moechte:
1. zunaechst zu loeschenden node finden, darauf achten dass man eine referenz auf selbigen hat (also kein foreach verwenden!)
2. dann $myNode = new SimpleXMLElement('<class>...data...</class>');
Verfasst: 17.09.2008, 10:59
von Airport1
Das Loeschen scheint doch mit unset zu funktionieren (sicherstellen dass man wirklich eine Referenz auf den richtigen Node hat!), sicherheitshalber kann man es so machen:
$xml->class[$i] = null; // deletes inner childs only

[just optionally]
unset($xml->class[$i]); // deletes node but inserts blank line?
Nachteil dieser Loesung ist aber dass man bevor man das XML wieder speichert man gut bedient ist leerzeilen zu loeschen, denn offensichtlich wird an der stelle des geloeschten Nodes sonst eine Leerzeile entstehen was CRC-Pruefungen ob sich an der Datei was inhaltsmaessig geaendert hat sonst immer sagt : ja

Verfasst: 19.09.2008, 14:35
von Southmedia
Naja, sauber ist aber definitiv anders...
Verfasst: 19.09.2008, 15:38
von Airport1
es ist zugegeben unschoen, aber ich finde das hin- und her zwischen dom und simplexml auch nicht gerade schoener (es ist sogar langsamer). vor allem ist das verhalten der dom implementierung sehr php-versionsabhaengig (man bedenke die wartung!). aber jedem wie es ihm/ihr/es gefaellt
