php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.03.2010, 20:47  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.255
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard DOM: Knoten ohne „echte“ Kinder bestimmen

Nabend,

ich habe folgendes Beispielsetup:
Code:
<tree>

  <leave>
    <inner>text</inner>
    <second>text</second>
  </leave>

  <leave><inner>text</inner>
  </leave>

</tree>
Ich durchlaufe den gesamten Dokumentbaum via DOM (php5) rekursiv Knoten für Knoten. Meine Applikation bietet dabei bestimmte Hooks, über die Callbacks angegeben werden, die dann den jeweiligen DOM-Knoten als Parameter erhalten.

Ich suche eine performante Methode, um Knoten zu unterscheiden, die direkt Text enthalten und welche, die andere Subknoten enthalten. Im obigen Beispiel also, bspw. alle Textinhalte von <inner> und <second> zu bearbeiten (und nur die). Das Problem dabei ist, dass (wie im ersten leave-Zweig) auch Umbrüche im DOM-Baum DOMText-Objekte bilden. Ich kann also nicht einfach den Typ von firstChild prüfen.

Kennt jemand eine Lösung? Habt Ihr eine Idee?

Voraussetzungen:
- die Lösung muss performant sein, weil ich sehr große Bäume verarbeiten muss (~6MB xml-Dateien). Irgendwelche Schleifen über die Kindelemente fallen damit vermutlich aus.
- Die Verwendung von DOM ist nicht verhandelbar.
- Die Entfernung allen Whitespaces (preserveWhiteSpace) zwischen den Knoten ist nicht möglich.
__________________
--
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   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 08.03.2010, 21:09  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.255
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Was haltet Ihr davon?

Zitat:
PHP-Code:
if ($oDOMNode->firstChild === $oDOMNode->lastChild
__________________
--
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   Mit Zitat antworten
Alt 08.03.2010, 21:43  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
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

Kannst du nicht einfach prüfen $oDOMNode->firstChild instanceof DOMText?
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 08.03.2010, 21:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.255
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Nee, wie gesagt, das "\n {Einrückung}" wirkt bspw. für das erste <leave> auch als DOMText-Knoten als firstChild. Außer man benutzt eben
PHP-Code:
DOMDocument::preserveWhiteSpace false
was ich aber vermeiden möchte. Es soll aber für beide <leave> Fälle funktionieren.

Mit der in #2 geposteten Variante funktionierts aber. Und ich vermute mal, Objektvergeliche via === sind jetzt nicht sooo teuer, oder?
__________________
--
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   Mit Zitat antworten
Alt 08.03.2010, 22:02  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.579
PHP-Kenntnisse:
Fortgeschritten
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Ich finde die Idee gut. Es gäbe noch isSameNode. Keine Ahnung, ob das schneller ist.

PHP-Code:
if ($node->firstChild->isSameNode($node->lastChild)
    && 
$node->firstChild->nodeType == XML_TEXT_NODE
) { 
mermshaus ist gerade online   Mit Zitat antworten
Alt 09.03.2010, 10:51  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 379
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ist zu lange her, dass ich das letzte Mal mit DOM gearbeitet hab...aber mal so eine fixe Idee - ein Text-Node dürfte ja eigentlich keine Kinder mehr haben, also solltest du ja mit hasChildNodes dran kommen.
Da die Whitespaces aber ebenfalls drunter fallen würden fiele mir spontan ein Check auf den Node-Namen ein, dieser müsste entweder leer sein oder sehr generisch, so dass man hier ggfls. ausfiltern könnte.

Vielleicht hilft aber auch DOMText::isWhitespaceInElementContent.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 09.03.2010, 16:01  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.255
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Stimmt, an den Nodenamen des ersten Elements habe ich nicht gedacht. Das geht vielleicht auch.

DOMText::isWhitespaceInElementContent brimgt mich für einen anderen Zweck weiter. Thx.
__________________
--
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   Mit Zitat antworten
Alt 10.03.2010, 13:38  
Erfahrener Benutzer
 
Benutzerbild von leonv
 
Registriert seit: 12.01.2009
Beiträge: 345
PHP-Kenntnisse:
Fortgeschritten
leonv befindet sich auf einem aufstrebenden Ast
Standard

Mit XPath kannst du über den XSLT-Processor überprüfen, wie viele childNodes vorhanden sind, siehe count().

Des weiteren kannst du die Abfrage noch weiter vereinfachen, wenn du auf XSLT setzt, indem du einfach den Text aus den Suchausdrücken "//inner" oder "//second" mit Hilfe von
Code:
<xsl:for-each select="//inner|//second">
   <xsl:value-of select="text()" />
</xsl:for-each>
herausholst.
__________________
Kreativität und Schöpfung durch Chaos und Ordnung.

Geändert von leonv (10.03.2010 um 13:41 Uhr).
leonv ist offline   Mit Zitat antworten
Alt 10.03.2010, 14:45  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.579
PHP-Kenntnisse:
Fortgeschritten
mermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblickmermshaus ist ein wunderbarer Anblick
Standard

Hast du das mal für eine 6 MB-Datei gebenchmarkt? Ich habe vorgestern etwas ähnliches versucht (allerdings als XPath-Query), das lief über 30 Sekunden (dann war Timeout).
mermshaus ist gerade online   Mit Zitat antworten
Alt 10.03.2010, 18:27  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.255
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Gebenchmarkt ist das falsche Wort, aber ich habe hier ne 22MB Datei (420000 Zeilen), bei der ich unter anderem dieses Verfahren anwende, um jeden Knoten via trim zu behandeln. Ohne Ausgaben (denn dann wirds fett) wird die innerhalb von knapp ner Minuten DOM-geladen, rekursiv verarbeitet und in eine neue Datei zurückgeschrieben. Wie gesagt, da passieren aber noch andere Dinge nebenbei.
Über Kommandozeile (späterer Anwendungszweck) unter Windows sogar nur 46 Sekunden.

XPath, auch @leonv, ist IMHO wesentlich aufwendiger für den XML-Parser, weil XPath ja bis auf die Attributebene und mit generischen Pfaden (:first etc.) arbeitet. Da ist rekursives DOM wohl wesentlich schneller, vor allem wenn man viele Knoten auswerten muss.

Und XSLT wird vermutlich noch schlimmer skalieren. Zumal ich DOM ja sowieso nutze, dann kann ich auch die ohnehin bestehenden Objekte verwenden.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (10.03.2010 um 18:32 Uhr).
nikosch ist gerade online   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
Eine Workflow-Engine mepeisen Software-Design 6 27.10.2009 07:07
Genauen Datentyp des Rückgabewerts der Funktion Count bestimmen Bloedi Datenbanken 5 25.08.2008 18:58
Position einer zeile in einer sortierten tabelle bestimmen Drache Datenbanken 9 17.06.2007 10:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php domdocument leere nodes, php domelement text ohne, php domdocument leer, php dom innertext, knoten kinder, has_child_nodes()===true, xslt knoten ohne kinder, node bestimmten type ermitteln, dom abstand zwischen knoten bestimmen, xsl anzahl kinder bestimmen, xslt dom-knoten, php dom node leer, php domdocument innertext, dom inhalt von knoten ohne kinder, javascript position im dom baum bestimmen, javascript checknode(), php dom schneller ,machen, http://www.php.de/php-fortgeschrittene/65490-dom-knoten-ohne-zechtea-oe-kinder-bestimmen.html, instanceof domtext, mermshaus domdocument

Alle Zeitangaben in WEZ +1. Es ist jetzt 19:11 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