php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.02.2012, 11:42  
Neuer Benutzer
 
Registriert seit: 21.11.2011
Beiträge: 8
PHP-Kenntnisse:
Anfänger
Schampanja befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] rekursiv durch ein DOMDocument

Hallo zusammen!
Ich habe eine Klasse geschrieben mit der ich viele verschiedene Operationen auf XML Dateien ausführen kann. Dazu lade ich die Dateien mittels
PHP-Code:
$xml = new DomDocument;
$xml->load($xmlpath); 
in ein DOMDocument. Für meine verschiedenen Operationen springe ich mittels XPath an die gewünschte stelle und füge ein, bzw. lösche etc.
Jetzt möchte ich eine Funktion clean() schreiben, die mein DOMDocument komplett nach Inhalten ohne „value“ z.B.
Code:
<xyz></xyz>
durchsucht. (Die gefundenen Nodes sollen dann entfernt werden. Das ist aber nicht Teil meiner Frage) Gibt es eine Möglichkeit mein DOMDocument komplett rekursiv zu durchsuchen? Ich könnte natürlich mich mit XPath durch ein Dokument hangeln, das halte ich aber für recht ineffizient und umständlich.

Vielen Dank für die Hilfe und Anregungen.
LG
Schampanja ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 02.02.2012, 15:26  
Neuer Benutzer
 
Registriert seit: 21.11.2011
Beiträge: 8
PHP-Kenntnisse:
Anfänger
Schampanja befindet sich auf einem aufstrebenden Ast
Standard

Hey,

ich bin an der Stelle ein gutes Stück weiter gekommen! Ich arbeite mich rekursiv durch das DOMDocument hindurch, und zwar wie folgendermaßen:

PHP-Code:
private function cleanRecursive($input){
    if(
$input->hasChildNodes()){
        
$subNodes $input->childNodes;
        foreach (
$subNodes as $subNode){
            
$this->cleanRecursive($subNode);
        }
    }else{
        if(!
$input->nodeValue){
            
$input->removeChild($input);
        }
    }
    return 
$input;    

Was leider noch nicht funktioniert ist das löschen der leeren nodes
Wie kann sich eine node selber löschen?

Folgendes funktioniert nicht:
PHP-Code:
$input->removeChild($input); 
Besten Dank und liebe Grüße!
Schampanja ist offline   Mit Zitat antworten
Alt 02.02.2012, 15:28  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
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

Zitat:
$input->removeChild($input);
Ein Node ist ja nicht sein Child. Ergo musst Du über den parentNode des Elements gehen. Bin nicht sicher, glaube über den RootNode geht das auch.
__________________
--
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 offline   Mit Zitat antworten
Alt 02.02.2012, 16:05  
Neuer Benutzer
 
Registriert seit: 21.11.2011
Beiträge: 8
PHP-Kenntnisse:
Anfänger
Schampanja befindet sich auf einem aufstrebenden Ast
Standard

Danke! Du hast natürlich recht! Durch die ganze rekursiv denkerei hab ich ein paar Knoten im Hirn Es muss so lauten:

PHP-Code:
$input->parentNode->removeChild($input); 
der gesammte code schaut jetzt so aus:

PHP-Code:
private function cleanRecursive($input){
    if(
$input->hasChildNodes()){
        
$subNodes $input->childNodes;
        foreach (
$subNodes as $subNode){
            
$this->cleanRecursive($subNode);
        }
    }else{
        if(!
$input->nodeValue){
            
$input->parentNode->removeChild($input);
        }
    }
    return 
$input;    

So richtig funktionieren tut das aber immer noch nicht. Ich bekomme keine Fehler, aber die leeren nodes sind leider noch immer da. Erkannt werden sie aber. Das habe ich getestet.
Kann das sein, dass ich die rekursiv veränderten nodes wieder neu einhängen muss? Ich kann es mir sonst nicht erklären.
Schampanja ist offline   Mit Zitat antworten
Alt 02.02.2012, 21:45  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
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

Ich hatte das Problem glaube ich auch mal. Liegt evtl. daran, dass die Nodes noch als Instanzen gebunden sind. Hast Du geprüft, ob die Bedingung im else überhaupt greift?
return $input; scheint mir im else-Fall auch falsch zu sein. Ist sowieso nicht nötig. DOM-Manipulation agiert auf Objektreferenzen und nen return-Wert wertest Du eh nicht aus.
__________________
--
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 offline   Mit Zitat antworten
Alt 03.02.2012, 10:53  
Neuer Benutzer
 
Registriert seit: 21.11.2011
Beiträge: 8
PHP-Kenntnisse:
Anfänger
Schampanja befindet sich auf einem aufstrebenden Ast
Standard

Mit dem return $input hast Du recht. Das brauche ich eigentlich nicht...

der else-Fall greift auf jeden Fall. Das habe ich folgendermaßen getestet:

PHP-Code:
private function cleanCVRecursive($input){
    if(
$input->hasChildNodes()){
        
$subNodes $input->childNodes;
        foreach (
$subNodes as $subNode){
            
$this->cleanCVRecursive($subNode);
        }
    }else{
        if(!
$input->nodeValue){
            
$input->parentNode->removeChild($input);
            
$this->count++;
            echo 
$this->count."<br>";
        }
    }    

und ich erhalte genau die Anzahl der nodes die eigentlich gelöscht werden sollten ...
Leider werden sie es nicht...
Schampanja ist offline   Mit Zitat antworten
Alt 03.02.2012, 14:52  
Neuer Benutzer
 
Registriert seit: 21.11.2011
Beiträge: 8
PHP-Kenntnisse:
Anfänger
Schampanja befindet sich auf einem aufstrebenden Ast
Standard

So, ich habe das Problem gelöst! Natürlich wird das ganze jetzt auch hier für die Nachwelt dokumentiert. Ich bin mir nicht sicher ob das so lupenrein und der beste Stiel ist, aber es funktioniert und macht genau das was es soll.

Ich habe die ganze Geschichte in 2 Funktionen aufgeteilt. Hier der Code:

PHP-Code:
function clean(){
    
$this->count 0;
    
$this->cleanRecursive($this->document);
    for(
$i=0;$i<sizeof($this->xpaths);$i++){
        
$myXPath =$this->xpaths[$i];
        
$xpath = new DomXPath($this->document);
        
$nodeList $xpath->query($myXPath);
        
        
        if(
$nodeList->length){
            
$node $nodeList->item(0);
            if(
$node->parentNode->removeChild($node));
        }
        
$this->document->saveXML();
    }
    
    echo 
$this->document->saveXML();
}


private function 
cleanRecursive($input){
    if(
$input->hasChildNodes()){
        
$subNodes $input->childNodes;
        foreach (
$subNodes as $subNode){
            
$this->cleanRecursive($subNode);
        }
    }else{
        
        if(!
$input->nodeValue){
            
$this->xpaths[sizeof($this->xpaths)] = input->parentNode->getNodePath();
        }
    }    

Da das löschen ja nicht funktioniert hat, ich aber die richtigen Nodes gefunden habe, habe ich mir einfach mittels getNodePath() den absoluten XPath Pfad zu den zu löschenden Nodes in einem Array gespeichert und das Array hinterher abgearbeitet. Funktioniert Super!
Für Verbesserungen bin ich offen!
Schampanja ist offline   Mit Zitat antworten
Alt 03.02.2012, 15:28  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
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

Schön und gut, aber warum führst Du ständig saveXML aus?
__________________
--
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 offline   Mit Zitat antworten
Alt 03.02.2012, 15:42  
Neuer Benutzer
 
Registriert seit: 21.11.2011
Beiträge: 8
PHP-Kenntnisse:
Anfänger
Schampanja befindet sich auf einem aufstrebenden Ast
Standard

ohh, das ist 'ne Leiche aus Testzwecken ...
geht natürlich auch ohne ...
danke
Schampanja ist offline   Mit Zitat antworten
Antwort


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
Array Merge - rekursiv aber mit überschreiben? jwka61 PHP Einsteiger 1 01.12.2011 18:22
[Erledigt] Objekte Rekursiv zerstören Fragensteller PHP-Fortgeschrittene 18 07.07.2011 15:28
Array aus SQL Abfrage zusammenbauen um es rekursiv abzuarbeiten litterauspirna PHP Einsteiger 7 01.02.2011 18:44
[Erledigt] Mit DOMDocument href und img auslesen marek89 PHP Einsteiger 11 23.01.2011 18:43
DomDocument für XML Vorlagen, ggf. auch einfacherer? SpiderJerusalem PHP Tipps 2010 4 14.06.2010 13:26
[Erledigt] Mit XPath im DOMDocument PHP5 und der foreach Schleife einen Element WERT hjw-kunstwerk PHP Tipps 2010 3 03.06.2010 00:07
[Erledigt] Warum DOMDocument ? Performanter? Veqeta PHP Tipps 2010 2 08.04.2010 15:47
DOMDocument tadeus PHP Tipps 2010 6 23.03.2010 14:21
[Erledigt] Array rekursiv auslesen mit Starttiefe ToM_ToM PHP-Fortgeschrittene 8 22.03.2010 17:19
debuggen von DOMDocument unter eclipse belphegor Off-Topic Diskussionen 1 20.10.2009 22:13
[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
FTP CHMOD Rekursiv xeon PHP Tipps 2007 10 18.07.2007 21:53
PHP5: DOMDocument + vererbung Syntaxx PHP-Fortgeschrittene 4 07.06.2006 09:02
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 rekursiv, php dom rekursion, php xml rekursiv, dom rekursiv durchlaufen php, domdocument mit referenzen arbeiten, xpath function rekursiv, php dom rekursiv funktion, php img in a domdocument abfragen, domdocument foreach, das domobjekt wurde gelöscht, php domdocument rekursiv, rekursive function dom abfrage

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:48 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