php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.09.2009, 15:26  
Neuer Benutzer
 
Registriert seit: 18.09.2009
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
alex999 befindet sich auf einem aufstrebenden Ast
Standard DomDocument removeChild ?

Hallo,

mal wieder DOM, das unbekannte Wesen...
Ich baue in meiner Klasse ein DomDoc auf. In etwa so:
PHP-Code:
$this->domDoc = new DOMDocument('1.0'$enc);
$this->last $this->domDoc->appendChild(new DOMElement('e1-1'));
$this->last $this->last->appendChild(new DOMElement('e2-1'));
$this->last $this->last->appendChild(new DOMElement('e2-2')); 
Dabei merke ich mir in $this->last immer das zuletzt hinzugefügte Element (einen DOMNode).

Später, in einer anderen Methode, möchte ich das zuletzt hinzugefügte Element wieder löschen:

PHP-Code:
$parent $this->last->parentNode;
$delNode $parent->removeChild($this->last);
$this->last $parent

Das klappt aber nicht. Das Element wird nicht gelöscht und es gibt auch keinen Fehler. Warum?
Irgendwie ist wohl die Verbindung zum DomDocument weg, da ein
PHP-Code:
$foundElement $this->domDoc->getElementsByTagName("e2-2")->item(0);
$foundElement->parentNode->removeChild($foundElement); 
funktioniert.

Das Dumme daran ist aber, dass es das Element 'e2-2' mehrmals geben kann, und ich dann auch noch eine Logik einbauen muss, um bei '$this->domDoc->getElementsByTagName("e2-2")->item(0);' den richtigen index zu wissen.

Danke für Tipps und schöne Grüße,
Alex
alex999 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.10.2009, 22:18  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Kannst ja dem Node zum Löschen ein eindeutiges Attribut zuweisen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 02.10.2009, 00:12  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Was heißt denn "klappt nicht", entweder du bekommst eine Erfolgs- oder Fehlermeldung ^^
Chriz ist gerade online  
Alt 05.10.2009, 15:19  
Neuer Benutzer
 
Registriert seit: 18.09.2009
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
alex999 befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

also 'klappt nicht' soll heißen, dass ich ich nicht in der Lage bin, vernünftig auf dem DomDocument zu arbeiten. Ich lege mir eine Klasse an, in der ein DomDoc erzeugt wird, danach hänge ich Nodes dran und alles ist ok. Ich merke mir z.B. immer den letzten Node in einer Klassenvariable.

Später möchte ich einen einzelnen Node (mit Kindernodes) entfernen bzw. hinzufügen:
PHP-Code:
$found $this->domdoc->getElementsByTagName($this->lastNode->nodeName)->item(0);
$parent $found->parentNode;
$parent->removeChild($found);
$this->lastNode $parent
Anscheinend geht hierbei aber die Verbindung zum DomDoc verloren, d.h. ich kann nichts mehr an $this->lastNode anhängen. Das entfernen klappt noch. Danach würde ich gerne an den neuen $this->lastNode wieder Elemente anhängen, aber die sind niemals vorhanden (ich kann Nodes anhängen ohne Fehler, aber diese neuen Nodes sind im gespeicherten DomDoc nicht vorhanden).

Ich bin es eigentlich von Bäumen so gewohnt, dass man sich eine Referenz auf einen Node merken kann und somit den Node (und genau diesen Node) wiederfindet, und damit machen kann was man will (Kinder dranhängen/löschen, Elternnodes suchen etc.).

Irgendwie werden manchmal Referenzen zurückgeliefert und manchmal nicht: Node anhängen und merken => später kann ich an den gemerkten Node weitere Nodes dranhängen.

Node suchen => anscheined kommt eine Kopie des Nodes zurück, ich kann zwar dann das Kind löschen, aber nichts mehr an den Knoten dranhängen....Irgendwie sehr komisch alles....
alex999 ist offline  
Alt 05.10.2009, 17:08  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Zitat:
Zitat von alex999 Beitrag anzeigen
Hallo,
PHP-Code:
$found $this->domdoc->getElementsByTagName($this->lastNode->nodeName)->item(0);
$parent $found->parentNode;
$parent->removeChild($found);
$this->lastNode $parent
Anscheinend geht hierbei aber die Verbindung zum DomDoc verloren, d.h. ich kann nichts mehr an $this->lastNode anhängen.
Dokumentation zu DOMDocument::getElementsByTagName

Zitat:
DOMNodeList DOMDocument::getElementsByTagName ( string $name )
This function returns a new instance of class DOMNodeList containing the elements with a given tag name.
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline  
Alt 05.10.2009, 17:39  
Neuer Benutzer
 
Registriert seit: 18.09.2009
Beiträge: 5
PHP-Kenntnisse:
Fortgeschritten
alex999 befindet sich auf einem aufstrebenden Ast
Standard

Ok das ist dann klar, danke.

Was habe ich für eine Alternative mir Nodes zu merken, aus dem DomDoc zu entfernen bzw. an einer 'beliebigen' Stelle wieder einzufügen?
Oder ist DomDoc dafür generell ungeeignet? Gibt es Alternativen?

Was ich machen möchte:
Ich möchte ein XML Dokument erzeugen, in dem XML-Tags mit Werten aus einer DB gefüllt sind. Das XML Dokument hat Kopf-Tags und Fuß-Tags, dazwischen sind mehrere, sich wiederholende XMLTags (incl. mehrerer Kinder).

Um ein valides XML Dokument zu bekommen wollte ich folgendes machen:

temporäres DomDoc erzeugen
Kopf-Tags hinzufügen
1x DB Inhalts-Tags hinzufügen
Fuß-Tags hinzufügen

dann Validierung gegen XSD:
-wenn valide, dann den Mittelteil, also die 1x DB Inhalts-Tags in ein endgültiges DomDoc (welches auch schon die Kopf- und Fuß-Tags enthält) kopieren

-wenn invalide in eine andere Datei inkl. libxml_errors kopieren

Dann das Ganze von vorne, nach und nach für alle DB Inhalts-Tags. Ich hoffe ihr versteht, was ich da brabbel...

Danach habe ich ein endgültiges DomDoc, welches mehrere DB Inhalts-Tags zwischen 1xKopf und 1xFuß-Tags hat und valide ist. Das Ganze deswegen so kompliziert, damit ich am Schluss eine Datei mit validem XML habe und eine Ausschuss-Datei, in der die invaliden Elemente mit Fehlerbeschreibung sind, damit die Fehler in der DB gefunden und behoben werden können.

Danke für Tipps,
Alex
alex999 ist offline  
Alt 05.10.2009, 18:40  
Erfahrener Benutzer
 
Registriert seit: 28.08.2009
Beiträge: 233
PHP-Kenntnisse:
Anfänger
Steve befindet sich auf einem aufstrebenden Ast
Standard

Mag ja sein, dass eine neue Instanz der Node-List zurückgeliefert wird, aber die Nodes sind trotzdem Referenzen.

Ich habe jetzt mal deinen Code ohne Klasse getestet und ich kann das Problem nicht nachvollziehen.
PHP-Code:
$domDoc = new DOMDocument('1.0');
$domDoc->formatOutput true;
 
// Elemente hinzufügen
$last $domDoc->appendChild(new DOMElement('e1-1')); 
$last $last->appendChild(new DOMElement('e2-1')); 
$last $last->appendChild(new DOMElement('e2-2'));
 
// Das letzte Element entfernen ('e2-2')
$found $domDoc->getElementsByTagName($last->nodeName)->item(0); 
$parent $found->parentNode
$parent->removeChild($found); 
$last $parent;
 
// Erneut ein Element hinzufügen
$last $last->appendChild(new DOMElement('x9-9'));
 
// Funzt ;)
echo '<pre>'.htmlspecialchars($domDoc->saveXML()).'</pre>'
Ausgabe
Code:
<?xml version="1.0"?>
<e1-1>
  <e2-1>
    <x9-9/>
  </e2-1>
</e1-1>
Steve ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] DOMDocument expects at least 1 parameter... iXtends PHP Tipps 2009 3 30.07.2009 21:01
Problem mit DOMDocument rawibu PHP-Fortgeschrittene 6 29.05.2009 11:31
Parsen mit DOMDocument Neuling08 PHP Tipps 2008 2 28.12.2008 15:57
DOMDocument erstellen ohne DocInfo robert PHP Tipps 2008 6 12.11.2008 12:47
PHP5: DOMDocument + vererbung Syntaxx PHP-Fortgeschrittene 4 07.06.2006 09:02
XML - removeChild a-team PHP Tipps 2006 8 28.04.2006 15:59
new DOMDocument() schlägt fehl PHP Tipps 2006 0 04.02.2006 15:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php dom removechild, domdocument removechild, php domdocument removechild, php removechild, php dom element löschen, removechild php, php dom knoten löschen, php dom remove node, php remove child, php getelementsbytagname, php domdocument remove child, htaccess files, dom remove child \php\, php domdocument element entfernen später neues element an stelle einfügen, php domdocument removeparent, php dom element entfernen, dom document removechild, php domdocument remove domelement, domdocument löschen, php dom elemente entfernen

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum