Robert R.: Gute HTML-Parser-Klasse gesucht

1 43

Gute HTML-Parser-Klasse gesucht

  1. 1
    1. 2
  2. 1
    1. 0
  3. 1
    1. 1
      1. 0
        1. 0
        2. 0
      2. 0
        1. 0
        2. 0
    2. 0
      1. 0
  4. 0

    DOMDocument & Co. richtig anwenden

    1. 0
      1. 0
        1. 0

          DOMDocument & Co. - grafische Darstellung erzeugen?

          1. 0
            1. 0

              DOMDocument & Co. - Beispiel gefunden, trotzdem Fragen

              1. 0

                DOMDocument & Co. - Nodetype für <style>-Definitionen gesucht

                1. 0

                  DOMDocument & Co. - CData-Node auseindernehmen

                  1. 0
                    1. 0
                      1. 0

                        DOMDocument & Co. - insertBefore()

                        1. 0

                          DOMDocument & Co. - insertBefore(), Nachtrag

                        2. 0
                          1. 0
                            1. 0
                              1. 0

                                Chakka! DOMDocument & Co. - insertBefore() - Teil 1

                              2. 0

                                CHAKKA! DOMDocument & Co. - insertBefore() - Teil 2

                              3. 0

                                DOMDocument & Co. - nodeValue versa textContent

                                1. 0
                                  1. 0
                                    1. 0

                                      Zeilenumbrüche!

                                      1. 0
                                    2. 0
                                    3. 1
                                      1. 0
                              4. 1

                                DOMDocument & Co. - Härte der Klasse: Test nicht bestanden

                                1. 0
                                  1. 0

Liebe Mitdenker, liebe Wissende, liebe Neugierige,

ja!

ich suche eine Empfehlung für eine gute HTML-Parser-Klasse.

Ich will aus einer fertigen (validen) Seite einzelne HTML-Elemente auslesen können und diese dann durch andere ersetzen, also z.B. eine Tabelle aus der Seite holen und durch eine andere (oder anders ausgefüllte) ersetzen.

Spirituelle Grüße Euer Robert

--
Möge der Forumsgeist wiederbelebt werden!
  1. Hakuna matata!

    ich suche eine Empfehlung für eine gute HTML-Parser-Klasse.

    Das ist schwierig. Erfahrungsgemäß sind die HTML5-Parser für PHP den Browserimplementationen immer unterlegen, man darf die Messlatte dafür nicht zu hoch ansetzen. Die offizielle DOMDocument-Erweiterung hat einen integrierten Parser und rudimentäre Methoden zum Traversieren wie getElementById(). querySelector() fehlt leider.

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      ich suche eine Empfehlung für eine gute HTML-Parser-Klasse.

      Das ist schwierig. Erfahrungsgemäß sind die HTML5-Parser für PHP den Browserimplementationen immer unterlegen, man darf die Messlatte dafür nicht zu hoch ansetzen. Die offizielle DOMDocument-Erweiterung hat einen integrierten Parser und rudimentäre Methoden zum Traversieren wie getElementById(). querySelector() fehlt leider.

      Das habe ich mir gerade nochmal vorgekramt. Ich werde es nochmal ausprobieren. Nachdem nun alle unsere Server mindestens PHP > 5.4 haben, könnte das erfolgreicher sein, als mein letzter Versuch. Ich habe jetzt ca. 1 Stunde erhalten, das nochmal auszuprobieren. Ist schon doof, wenn immer erwartet wird, dass man alles schon weiß, wenn es gefragt wird... :-(

      Spirituelle Grüße Euer Robert

      --
      Möge der Forumsgeist wiederbelebt werden!
  2. Lieber Robert R.,

    ich suche eine Empfehlung für eine gute HTML-Parser-Klasse.

    https://github.com/Masterminds/html5-php

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      Lieber Robert R.,

      ich suche eine Empfehlung für eine gute HTML-Parser-Klasse.

      https://github.com/Masterminds/html5-php

      Dank. Das werde ich mir gleich zuhause mal reinziehen. Mal sehen, wie weit ich damit noch komme.

      Spirituelle Grüße Euer Robert

      --
      Möge der Forumsgeist wiederbelebt werden!
  3. Ich will aus einer fertigen (validen) Seite einzelne HTML-Elemente auslesen können und diese dann durch andere ersetzen, also z.B. eine Tabelle aus der Seite holen und durch eine andere (oder anders ausgefüllte) ersetzen.

    Sowas?

    
    html = lxml.html.fromstring("<html><body><p>Eine</p></body></html>")
    div = lxml.html.fromstring("<div><span>Suppe</span></div>")
    
    p = html.xpath("//p")
    p[0].getparent().replace(p, div)
    
    lxml.html.tostring(html)
    '<html><body><div><span>Suppe</span></div></body></html>'
    

    Ach, PHP … schade.

    1. Hakuna matata!

      Ich will aus einer fertigen (validen) Seite einzelne HTML-Elemente auslesen können und diese dann durch andere ersetzen, also z.B. eine Tabelle aus der Seite holen und durch eine andere (oder anders ausgefüllte) ersetzen.

      Sowas?

      
      
      > html = lxml.html.fromstring("<html><body><p>Eine</p></body></html>")
      > div = lxml.html.fromstring("<div><span>Suppe</span></div>")
      > 
      > p = html.xpath("//p")
      > p[0].getparent().replace(p, div)
      > 
      > lxml.html.tostring(html)
      > '<html><body><div><span>Suppe</span></div></body></html>'
      
      

      Ach, PHP … schade.

      DOMDocument::loadHTML() basiert genau wie der Python-Parser auf libxml.

      --
      “All right, then, I'll go to hell.” – Huck Finn
      1. DOMDocument::loadHTML() basiert genau wie der Python-Parser auf libxml.

        Basiert ist wohl der richtige Ausdruck (lxml ist keine 1:1-Umsetzung von libxml2, ausdrücklich nicht) und zudem war ja nicht nur nach einer Möglichkeit gesucht, HTML in ein Objekt zu laden, das wäre alleine ziemlich nutzlos.

        (Aber das soll hier jetzt nicht ausarten. Es wurde nach PHP gefragt.)

        1. Hakuna matata!

          DOMDocument::loadHTML() basiert genau wie der Python-Parser auf libxml.

          Basiert ist wohl der richtige Ausdruck (lxml ist keine 1:1-Umsetzung von libxml2, ausdrücklich nicht) und zudem war ja nicht nur nach einer Möglichkeit gesucht, HTML in ein Objekt zu laden, das wäre alleine ziemlich nutzlos.

          PHPs DOM Implementierung ist auch keine 1:1-Umsetzung. Man hat bei PHP versucht in Richtung DOM zu abstrahieren, in Python hat man eine neue API entworfen, die mehr dem Python-Stil entspricht. Beides hat seine Vor- und Nachteile. Ich dachte du spielst mit deinem Kommentar "Ach, PHP … schade." auf einen konkreten Nachteil in der PHP-API an, deswegen habe ich das nochmal aufgegriffen.

          Beide Implementierungen teilen sich vermutlich den Nachteil, dass die Parser nicht HTML5-konform sind.

          --
          “All right, then, I'll go to hell.” – Huck Finn
        2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          (Aber das soll hier jetzt nicht ausarten. Es wurde nach PHP gefragt.)

          Naja, ich könnte ja andere Shells oder Runtimes aus PHP heraus starten und das Zwischenergebnis dann irgendwie übergeben, im Zweifel in einer Datei. Dann würde das System aber später vermutlich einschlafen.

          Spirituelle Grüße Euer Robert

          --
          Möge der Forumsgeist wiederbelebt werden!
      2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        ja!

        DOMDocument::loadHTML() basiert genau wie der Python-Parser auf libxml.

        Das funktioniert aber leider nicht so, oder ich bin einfach zu blöd, es anzuwenden. Wenn ich mir ein ausgeschnittenes Objekt mit var_dump() anzeigen lasse, kommt nur wirres Zeugs dabei heraus.

        Spirituelle Grüße Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
        1. Hakuna matata!

          Das funktioniert aber leider nicht so, oder ich bin einfach zu blöd, es anzuwenden. Wenn ich mir ein ausgeschnittenes Objekt mit var_dump() anzeigen lasse, kommt nur wirres Zeugs dabei heraus.

          Beispiel?

          --
          “All right, then, I'll go to hell.” – Huck Finn
        2. Lieber Robert R.,

          Wenn ich mir ein ausgeschnittenes Objekt mit var_dump() anzeigen lasse, kommt nur wirres Zeugs dabei heraus.

          was bitte ist ein "ausgeschnittenes Objekt"? Meinst Du eine DOMNode? Oder gar ein DOMElement? Und was willst Du mit var_dump() genau erreichen? Dachtest Du, Du könntest so den HTML-Quelltext sehen?

          Um den HTML-Quelltext zu sehen benötigst Du die passende Methode des DOMDocument-Objektes:

          $str_html = $myDOMDocument->[saveHTML](http://php.net/manual/en/domdocument.savehtml.php)();
          
          $myDOMDocument->[saveHTMLFile](http://php.net/manual/en/domdocument.savehtmlfile.php)('./test.html');
          

          Willst Du nur das HTML eines Elements, musst Du den Elementknoten als Parameter übergeben:

          $myDOMNodeObj = $myDOMDocument->getElementsByTagName('body')->item(0);
          
          $str_html = $myDOMDocument->[saveHTML](http://php.net/manual/en/domdocument.savehtml.php)($myDOMNodeObj);
          

          Liebe Grüße,

          Felix Riesterer.

          --
          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      Ich will aus einer fertigen (validen) Seite einzelne HTML-Elemente auslesen können und diese dann durch andere ersetzen, also z.B. eine Tabelle aus der Seite holen und durch eine andere (oder anders ausgefüllte) ersetzen.

      Sowas?

      ja!²

      
      
      > html = lxml.html.fromstring("<html><body><p>Eine</p></body></html>")
      > div = lxml.html.fromstring("<div><span>Suppe</span></div>")
      > 
      > p = html.xpath("//p")
      > p[0].getparent().replace(p, div)
      > 
      > lxml.html.tostring(html)
      > '<html><body><div><span>Suppe</span></div></body></html>'
      
      

      Ach, PHP … schade.

      Du bist gemein! ;-P

      Spirituelle Grüße Euer Robert

      --
      Möge der Forumsgeist wiederbelebt werden!
      1. Ach, PHP … schade.

        Du bist gemein! ;-P

        Äh …

        ja!

  4. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    ja!

    ich suche eine Empfehlung für eine gute HTML-Parser-Klasse.

    Wie UP schon in schrieb, sollte ich mein Anliegen nochmal genauer darlegen.

    Ich will aus einer fertigen (validen) Seite einzelne HTML-Elemente auslesen können und diese dann durch andere ersetzen, also z.B. eine Tabelle aus der Seite holen und durch eine andere (oder anders ausgefüllte) ersetzen.

    Teil 1 scheint mit den DOMDocument-Klassen zu funktionieren. Ich muss mich allerdings noch genauer damit beschäftigen, welche Methoden aus welcher Unterklasse da was leisten. Aber ein paar aus dem Web zusammengeklaubte Lösungsansätze gehen schon in die richtige Richtung. Leider haben die alle ihre Macken bei Rekursion und Konsequenz. Aber das traue ich mir zu, repariert zu bekommen - wenn es nicht eine fertige Funktion / Methode dafür gibt. Das Rad nochmal zu erfinden, habe ich keine Zeit...

    Ich möchte aus dem Dokument

    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
           "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <title>DomDocument</title>
    </head>
    <body>
    
    	<div id="main">
    		<div id="left">1</div>
    		<div id="center">2</div>
    		<div id="right">3</div>	
    	</div>	
    
    	<table id="t001">
    		<tr id="t001-tr001">
    			<td>1-Eins</td>
    			<td>1-Zwei</td>
    			<td>1-Drei</td>
    		</tr>
    
    		<tr id="t001-tr002">
    			<td>2-Eins</td>
    			<td>2-Zwei</td>
    			<td>2-Drei</td>
    		</tr>
    	</table>
    	
    	<table id="t002">
    		<tr id="t002-tr001">
    			<td>2-Eins</td>
    			<td>2-Zwei</td>
    			<td>2-Drei</td>
    		</tr>
    	</table>
    </body>
    </html>
    
    
    

    z.B. die Tabelle t001 extrahieren und als Array darstellen.

    
    # Element = $table
    # id = tr001
    Array
    (
        [@attributes] => Array
        (
            [id] => t001
        )
    
        [tr] => Array
    	(
    		[0] => Array
    		(
    			[@attributes] => Array
    			(
    				[id] => t001-tr001
    			)
    
    			[td] => Array
    			(
    				[0] => Array
    				(
    					[@attributes] => NULL
    					[#text] => 1-Eins
    				)	
    
    				[1] => Array
    				(
    					[@attributes] => NULL
    					[#text] => 1-Zwei
    				)	
    
    				[2] => Array
    				(
    					[@attributes] => NULL
    					[#text] => 1-Drei
    				)	
    			)
    		)			
    
    		[1] => Array
    		(
    			[@attributes] => Array
    			(
    				[id] => t001-tr002
    			)
    
    			[td] => Array
    			(
    				[0] => Array
    				(
    					[@attributes] => NULL
    					[#text] => 2-Eins
    				)	
    
    				[1] => Array
    				(
    					[@attributes] => NULL
    					[#text] => 2-Zwei
    				)	
    
    				[2] => Array
    				(
    					[@attributes] => NULL
    					[#text] => 2-Drei
    				)	
    			)
    		)			
    	)
    )
    
    
    

    Das ist jetzt nur ein Beispiel und müsste ggf. noch erweitert werden.

    Dann möchte ich an der Stelle im HTML-Dokument, an der die Tabelle stand, eine veränderte einfügen. Aus dem Array wieder HTML zu erzeugen, ist da sicher nicht das Problem, sondern nur, genau die alte Tabelle auszuschneiden und die Position zu liefern, an der sie begann.

    Solange man Validität voraussetzen kann, könnte das alles sogar ohne größeren Aufwand funktionieren.

    Ich habe hoffentlich am Wochenende noch Zeit, mich weiter darum zu kümmern. Dann geht es hier weiter.

    Spirituelle Grüße Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!
    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      Gibt es eigentlich eine anerkannte (einheitliche) Darstellungsweise für das DOM als Array?

      So gefällt sie mir noch nicht. Aber bevor ich da jetzt das Rad ein drittes Mal erfinde, wüsste ich gerne, ob irgendwo was offizielles darüber finde.

      
      Array
      (
          [html] => Array
              (
                  [head] => Array
                      (
                          [title] => DomDocument
                      )
      
                  [body] => Array
                      (
                          [div] => Array
                              (
                                  [div] => Array
                                      (
                                          [0] => Array
                                              (
                                                  [p] => Array
                                                      (
                                                          [@value] => Ich bin 1
                                                          [@attributes] => Array
                                                              (
                                                                  [class] => rot
                                                              )
      
                                                      )
      
                                                  [@attributes] => Array
                                                      (
                                                          [id] => left
                                                      )
      
                                              )
      
                                          [1] => Array
                                              (
                                                  [h1] => Ich bin 2
                                                  [@attributes] => Array
                                                      (
                                                          [id] => center
                                                      )
      
                                              )
      
                                          [2] => Array
                                              (
                                                  [@value] => Ich bin 3
                                                  [@attributes] => Array
                                                      (
                                                          [id] => right
                                                      )
      
                                              )
      
                                      )
      
      ## gekürzt
      
      
      

      Insbesondere möchte ich das etwas konsequenter handhaben, und einheitlichen Subarrays arbeiten, die die Nodes abbilden.

      Spirituelle Grüße Euer Robert

      --
      Möge der Forumsgeist wiederbelebt werden!
      1. Tach!

        Gibt es eigentlich eine anerkannte (einheitliche) Darstellungsweise für das DOM als Array?

        Das DOM ist kein Array sondern ein Baum. Verschachtelte Arrays sind da lediglich Vehikel, um den Baum darzustellen. Objekte sind eine Alternative. Da sind aber im Gegensatz zu den assiziativen Arrays nur die Keys durch Propertynamen ausgetauscht. Bei Eigenschaften mit einer größeren Menge an Werten als 1 braucht es dann auch wieder Arrays oder ähnliche Strukturen (Listen, Dictionarys).

        So gefällt sie mir noch nicht. Aber bevor ich da jetzt das Rad ein drittes Mal erfinde, wüsste ich gerne, ob irgendwo was offizielles darüber finde.

        SimpleXML und der große Bruder die DOM-Klassen-Sammlung.

        Insbesondere möchte ich das etwas konsequenter handhaben, und einheitlichen Subarrays arbeiten, die die Nodes abbilden.

        Klassen (insbesondere DOMNode) mit festgelegten Propery-Namen statt Arrays mit beliebigen String-Werten als Keys.

        dedlfix.

        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          Klassen (insbesondere DOMNode) mit festgelegten Property-Namen statt Arrays mit beliebigen String-Werten als Keys.

          Die habe ich schon am Wickel. So ganz steige ich durch die Klassensammlung aber noch nicht durch.

          Wenn ich anstelle der varianten Arrays Klassenobjekte nehmen soll, müsste ich also zuerst mal die Klasse DOMNode anschauen? http://php.net/manual/en/class.domnode.php

          Sieht mir bisher noch "überbestimmt" aus, aber das wird sicherlich täuschen. Ist nicht ganz einfach, die Gedanken der Entwickler einer Klassengruppe nachzuempfinden und zu verstehen.

          Kennst Du eine Klasse, die eine grafische Darstellung des DOM-Objekts ermöglicht?

          Spirituelle Grüße Euer Robert

          --
          Möge der Forumsgeist wiederbelebt werden!
          1. Tach!

            Wenn ich anstelle der varianten Arrays Klassenobjekte nehmen soll, müsste ich also zuerst mal die Klasse DOMNode anschauen? http://php.net/manual/en/class.domnode.php

            DOMNode ist die Basisklasse. Es gibt dan auch noch Spezialisten wie DOMElement und DOMDocument und Hilfsklassen wie DOMNodeList oder DOMXPath. Weniger aufwendig, aber teilweise auch recht undurchsichtig ist SimpleXML. Das arbeitet viel mit den sogenannten magischen Methoden und Eigenschaften, die erst zur Laufzeit Inhalte zeigen, nicht schon bei der Debugausgabe.

            Sieht mir bisher noch "überbestimmt" aus, aber das wird sicherlich täuschen.

            DomNode ist ja auch dafür designt, mit allen (Un-)Möglichkeiten XMLs zurechtzukommen. Für einfach gelagerte HTML-Anwendungsfälle ist da sicher eine ganze Menge unverwendbarer Funktionalität dabei.

            Kennst Du eine Klasse, die eine grafische Darstellung des DOM-Objekts ermöglicht?

            var_dump() oder print_r() auf ein DOMDocument/DOMElement ;)

            dedlfix.

            1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

              ja!

              DomNode ist ja auch dafür designt, mit allen (Un-)Möglichkeiten XMLs zurechtzukommen. Für einfach gelagerte HTML-Anwendungsfälle ist da sicher eine ganze Menge unverwendbarer Funktionalität dabei.

              Ein mMn gutes Beispiel habe ich hier gefunden http://ppfeufer.de/php-einmal-xml-to-array-und-zurueck-bitte/ leider steige ich aber trotz der Dokumentierungen noch nicht so ganz durch durch das Klassengewirr von DOMDocument & Co.

              Ich würde also dazu noch ein paar Fragen stellen, wenn sich hier noch jemand damit auskennt und die Geduld aufbringt, zu antworten. Kann aber noch ein bisschen dauern.

              Kennst Du eine Klasse, die eine grafische Darstellung des DOM-Objekts ermöglicht?

              var_dump() oder print_r() auf ein DOMDocument/DOMElement ;)

              Da kommt leider nur Quatsch bei raus.

              Spirituelle Grüße Euer Robert

              --
              Möge der Forumsgeist wiederbelebt werden!
              1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                ja!

                Wie komme ich an die Style-Definitionen? Ich habe mir das Dokument in der Form

                
                /html
                /html/head
                /html/head/title
                /html/head/title/#text: DomDocument
                /html/head/style
                /html/head/style/#attrib[type]: text/css
                /html/body
                /html/body/#text: Hallo, hier steht Text
                    in zwei Zeilen mit Umbruch
                
                
                

                auseinander nehmen lassen.

                Welchen Node-Type http://php.net/manual/de/dom.constants.php haben die Style-Definitionen?

                Das bekomme ich einfach nicht raus :-(

                Spirituelle Grüße Euer Robert

                --
                Möge der Forumsgeist wiederbelebt werden!
                1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                  ja!

                  Wie komme ich an die Style-Definitionen? Ich habe mir das Dokument in der Form

                  
                  /html
                  /html/head
                  /html/head/title
                  /html/head/title/#text: DomDocument
                  /html/head/style
                  /html/head/style/#attrib[type]: text/css
                  /html/head/style/#cdata: body {
                  			font-family: century gothic, sans-serif;
                  		}
                  /html/body
                  /html/body/#text: Hallo, hier steht Text
                      in zwei Zeilen mit Umbruch
                  /html/body/div
                  /html/body/div/#attrib[id]: main
                  
                  

                  auseinander nehmen lassen.

                  Den NodeType habe ich inzwischen mit XML_CDATA_SECTION_NODE (4) identifiziert.

                  Leider weiß ich immer noch nicht, wie ich die Style-Definitionen dann auseinandernehmen kann, ob das die DOMDocument-Klassensammlung auch leistet.

                  Spirituelle Grüße Euer Robert

                  --
                  Möge der Forumsgeist wiederbelebt werden!
                  1. Tach!

                    Wie komme ich an die Style-Definitionen?

                    Über einen CSS-Parser. Ein solcher gehört meines Wissens nicht zum Lieferumfang von PHP.

                    Leider weiß ich immer noch nicht, wie ich die Style-Definitionen dann auseinandernehmen kann, ob das die DOMDocument-Klassensammlung auch leistet.

                    CSS ist ebenso wie Javascript-Code kein Teil des DOMs. Aus dessen Sicht ist es lediglich Text oder CData.

                    dedlfix.

                    1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                      ja!

                      Wie komme ich an die Style-Definitionen?

                      Über einen CSS-Parser. Ein solcher gehört meines Wissens nicht zum Lieferumfang von PHP.

                      Leider weiß ich immer noch nicht, wie ich die Style-Definitionen dann auseinandernehmen kann, ob das die DOMDocument-Klassensammlung auch leistet.

                      CSS ist ebenso wie Javascript-Code kein Teil des DOMs. Aus dessen Sicht ist es lediglich Text oder CData.

                      Das habe ich befürchtet. Habe auch schon ein paar PHP-CSS-Parser gefunden. Ich wollte das Ganze nur ungern so weit aufblasen...

                      Die xPath-Darstellung ist übrigens ganz praktisch zur Visualisierung. Schön kompakt und aufgeräumt.

                      Spirituelle Grüße Euer Robert

                      --
                      Möge der Forumsgeist wiederbelebt werden!
                      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                        ja!

                        jetzt hat das alles schon so schön geklappt, nur insertBefore() krieg ich einfach nicht hin Ich habe schon mindestens 30 Webseiten durch, in denen die Leute ähnliche Probleme haben. Manchmal gibt es eine angebliche Lösung (die nicht funktioniert), meistens belibt die Frage aber offen.

                        
                        
                        $td = $dom->createElement('td');
                        $td->nodeValue = 'Ich bin neu';
                        $td->setAttribute('class', 'saldo');
                        $tr = $dom->getElementById('t001-tr001');
                        
                        $first = $tr->firstChild;
                        $last = $tr->lastChild;
                        
                        echo "\r\n<pre>";
                        echo htmlspecialchars(print_r($first, 1));
                        echo "\r\n</pre>";
                        
                        $newtd1 = $tr->insertBefore($td, $first);
                        $newtd2 = $tr->appendChild($td);
                        
                        
                        

                        appendChild() funktioniert wunschgemäß, insertBefore() macht einfach nix. Die Node taucht nicht auf.

                        dumm guck Ratlosigkeit

                        Spirituelle Grüße Euer Robert

                        --
                        Möge der Forumsgeist wiederbelebt werden!
                        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                          ja!

                          insertBefore() krieg ich einfach nicht hin Ich habe schon mindestens 30 Webseiten durch,

                          eine ist z.B. diese http://sampsonblog.com/192/prependchild-on-domelement-in-php-sort-of die doch absolut hoffnungsfroh aussieht.

                          Leider funktioniert es bei mir nicht. Weder in xPath-Liste, noch im generierten Dokument bewirkt die neue Node eine Änderung.

                          Gibt's denn im selfRaum irgendwo ein ausführlicheres Tutorial zu PHP-DOMDocument? Ich habe auch schon eine ganze Menge Info aus JavaScript-Dokumentationen entnommen und einfach mal versucht, die auf die PHP-Klassensammlung zu übertragen. Meistens führt das sogar zu einer Lösung.

                          Spirituelle Grüße Euer Robert

                          --
                          Möge der Forumsgeist wiederbelebt werden!
                        2. Lieber Robert R.,

                          $newtd1 = $tr->insertBefore($td, $first);

                          warum verwendest Du nicht folgendes:

                          $newtd1 = $first->parentNode->insertBefore($td, $first);

                          Liebe Grüße,

                          Felix Riesterer.

                          --
                          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                            ja!

                            Lieber Robert R.,

                            $newtd1 = $tr->insertBefore($td, $first);

                            warum verwendest Du nicht folgendes:

                            $newtd1 = $first->parentNode->insertBefore($td, $first);

                            Hab ich auch schon ausprobiert. Da passiert einfach nix. Aber wenn man dann $newtd1 anzeigen lässt mit var_dump() oder print_r(), dann sieht das sehr vernünftig aus. Die Node wird aber leider nicht eingehängt in den Baum, nirgendwo. Ich habe das schon, so gut ich konnte durchgeklappert.

                            Sieht irgendwie so aus, als sei die Klasse hier buggi.

                            
                            /html/body/table[1]
                            /html/body/table[1]/#attrib[id]: t001
                            /html/body/table[1]/tr[1]
                            /html/body/table[1]/tr[1]/#attrib[id]: t001-tr001
                            /html/body/table[1]/tr[1]/td[1]
                            /html/body/table[1]/tr[1]/td[1]/#attrib[class]: c1
                            /html/body/table[1]/tr[1]/td[1]/#text: 1-1-Eins
                            /html/body/table[1]/tr[1]/td[2]
                            /html/body/table[1]/tr[1]/td[2]/#text: 1-1-Zwei
                            /html/body/table[1]/tr[1]/td[3]
                            /html/body/table[1]/tr[1]/td[3]/#attrib[class]: c1
                            /html/body/table[1]/tr[1]/td[3]/#text: 1-1-Drei
                            /html/body/table[1]/tr[1]/td[4]
                            /html/body/table[1]/tr[1]/td[4]/#attrib[class]: saldo
                            /html/body/table[1]/tr[1]/td[4]/#text: Ich bin neu
                            /html/body/table[1]/tr[2]
                            /html/body/table[1]/tr[2]/#attrib[id]: t001-tr002
                            /html/body/table[1]/tr[2]/td[1]
                            /html/body/table[1]/tr[2]/td[1]/#text: 1-2-Eins
                            /html/body/table[1]/tr[2]/td[2]
                            /html/body/table[1]/tr[2]/td[2]/#text: 1-2-Zwei
                            /html/body/table[1]/tr[2]/td[3]
                            /html/body/table[1]/tr[2]/td[3]/#text: 1-2-Drei
                            
                            
                            

                            Die Node müsste auf Platz [1] auftauchen, und genauso aussehen, die jetzt auf Platz [4] steht. Die habe ich mit

                            
                            $newtd2 = $tr->appendChild($td);
                            
                            
                            

                            dort eingehängt, nachdem ich das insertBefore()-Stetement im Programmfluss stehen haben.

                            Spirituelle Grüße Euer Robert

                            --
                            Möge der Forumsgeist wiederbelebt werden!
                            1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                              ja!

                              habe einen Fehlerpfad gefunden.

                              Wenn man dieselbe vorbereitete newNode innerhalb eines Durchlaufes erst für insertBefore() und anschließend für appenChild() verwendet, gewinnt der letzte INSERT, also das appenChild(). Das muss ich freilich noch genauer untersuchen, aber es wird augenscheinlich nicht mit dem Muster der neunen Node gearbeitet, sondern mit dem Original.

                              Spirituelle Grüße Euer Robert

                              --
                              Möge der Forumsgeist wiederbelebt werden!
                              1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                                chakka!

                                habe einen Fehlerpfad gefunden.

                                Wenn man dieselbe vorbereitete newNode innerhalb eines Durchlaufes erst für insertBefore() und anschließend für appenChild() verwendet, gewinnt der letzte INSERT, also das appenChild(). Das muss ich freilich noch genauer untersuchen, aber es wird augenscheinlich nicht mit dem Muster der neunen Node gearbeitet, sondern mit dem Original.

                                meine Test-HTML:

                                
                                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                                       "http://www.w3.org/TR/html4/loose.dtd">
                                <html>
                                <head>
                                	<meta http-equiv="content-type" content="text/html; charset=utf-8">
                                	<title>DomDocument</title>
                                
                                	<link rel="stylesheet" type="text/css" href="style.css">
                                	<style type="text/css">
                                		body {
                                			font-family: century gothic, sans-serif;
                                		}
                                		
                                		img {
                                			border: 1px solid blue;
                                			padding: 5px;
                                			background-color: #30C060;
                                		}
                                		
                                		table {
                                			border: 1px solid #000000;
                                			padding: 3px;
                                			border-collapse: collapse;
                                			cell-spacing: 0;	
                                		}
                                		
                                		td {
                                			border: 1px dotted #000000;
                                			padding: 3px;
                                		}
                                	</style>	
                                	
                                	
                                </head>
                                <body>
                                	<!-- BEGINN Einleitungstext -->
                                	
                                	Hallo, hier steht Text
                                    in zwei Zeilen mit Umbruch	
                                
                                	<!-- ENDE Einleitungstext -->
                                	
                                	<div id="main">
                                		<div id="left"><p class="rot">Ich bin 1</p></div>
                                		<div id="center"><h1>Ich bin 2</h1></div>
                                		<div id="right"><img src="harzhexe.jpg" alt="Harzhexe"></div>	
                                		<a href="standard.doc.html" title="hier klicken">Hier klicken</a>
                                	</div>	
                                
                                	<table id="t001">
                                		<tr id="t001-tr001">
                                			<td class="c1">1-1-Eins</td>
                                			<td>1-1-Zwei</td>
                                			<td class="c1">1-1-Drei</td>
                                		</tr>
                                
                                		<tr id="t001-tr002">
                                			<td>1-2-Eins</td>
                                			<td>1-2-Zwei</td>
                                			<td>1-2-Drei</td>
                                		</tr>
                                	</table>
                                
                                	<br>
                                	
                                	<table id="t002">
                                		<tr id="t002-tr001">
                                			<td>2-2-Eins</td>
                                			<td>2-2-Zwei</td>
                                			<td>2-2-Drei</td>
                                		</tr>
                                	</table>
                                
                                </body>
                                </html>
                                
                                
                                

                                Ausschnitt aus dem Testskript:

                                
                                $dom = new DOMDocument('1.0', 'utf-8');
                                #$dom = new DOMDocument();
                                
                                $dom->formatOutput = TRUE;
                                #$dom->validateOnParse = TRUE;
                                $dom->normalizeDocument();
                                #$dom->preserveWhiteSpace = false;
                                $dom->loadHTMLFile('standard.doc.html');
                                
                                #var_dump($dom->validateOnParse);
                                
                                
                                $td = $dom->createElement('td');
                                $td->setAttribute('class', 'saldo');
                                
                                $td1 = clone $td;
                                $td2 = clone $td;
                                
                                $td1->nodeValue = 'Ich bin die erste neue Node';
                                $td2->nodeValue = 'Ich bin die zweite neue Node';
                                
                                $tr = $dom->getElementById('t001-tr001');
                                $first = $tr->firstChild;
                                $first_td = $tr->getElementsByTagName('td')->item(0);
                                $last = $tr->lastChild;
                                
                                echo "\r\n<pre>";
                                echo htmlspecialchars(print_r($tr, 1));
                                echo "\r\n</pre>";
                                
                                
                                echo "\r\n<pre>";
                                echo htmlspecialchars(print_r($first_td, 1));
                                echo "\r\n</pre>";
                                
                                #$newtd1 = $first_td->parentNode->insertBefore($td, $first_td);
                                #$newtd1 = $tr->insertBefore($td, $first_td);
                                #$newtd1 = $tr->insertBefore($td);
                                #$newtd1 = $first->parentNode->insertBefore($td, $first);
                                #$newtd1 = $first->parentNode->insertBefore($td, $first);
                                $newtd1 = $tr->insertBefore($td1, $first);
                                
                                echo "\r\n<pre>";
                                echo htmlspecialchars(print_r($newtd1, 1));
                                echo "\r\n</pre>";
                                
                                
                                $newtd2 = $tr->appendChild($td2);
                                
                                $elements = NULL;
                                #if ($dom->validate())
                                {
                                	$elements = $dom->getElementsByTagName('*');
                                }
                                #else
                                {
                                #	echo "Dokument ist nicht valide";
                                #	exit;
                                }	
                                
                                
                                #$table = $dom->getElementById('t001');
                                #$table->normalize();
                                
                                #$_arr = getArray($table);
                                
                                
                                echo "<h1>DOM Document</h1>\r\n";
                                
                                echo "<pre>\r\n";
                                #var_dump($table);
                                #echo htmlspecialchars(print_r($table, 1));
                                
                                #echo htmlspecialchars($dom->saveHTML($table));
                                #echo htmlspecialchars(print_r($_arr, 1));
                                #echo "\r\n", htmlspecialchars(print_r(dom2array($table), 1));
                                #echo "\r\n", htmlspecialchars(print_r(xml_to_array($table), 1));
                                
                                
                                
                                
                                
                                if (!is_null($elements))
                                {
                                	$indent = 0;
                                	foreach ($elements as $element)
                                	{
                                		if ($element->nodeType == XML_ELEMENT_NODE)
                                		{
                                #			echo "\r\n" . $element->nodeName . ": ";
                                			$xpath = "\r\n" . $element->getNodePath();
                                			echo $xpath;
                                
                                			if ($element->hasAttributes())
                                			{
                                				$attributes = $element->attributes;
                                				foreach ($attributes as $attrib)
                                				{
                                					echo $xpath . '/#attrib[' . $attrib->name . ']: ' . $attrib->value;
                                				}
                                			}
                                			
                                			if ($element->hasChildNodes())
                                			{
                                				$nodes = $element->childNodes;
                                				foreach ($nodes as $node)
                                				{
                                					## HTML-Nutztext
                                					if ($node->nodeType == XML_TEXT_NODE)
                                					{
                                						if (strlen(trim($node->nodeValue)) > 0)
                                						{
                                							echo $xpath . '/#text: ' . trim($node->nodeValue);
                                						}	
                                					}
                                					## Text in <style>, usw.	
                                					elseif ($node->nodeType == XML_CDATA_SECTION_NODE)
                                					{
                                #						echo $xpath . '/#cdata-length: ' . trim($node->length);						
                                						echo $xpath . '/#cdata: ' . trim($node->textContent);
                                					}
                                					## Kommentare
                                					elseif ($node->nodeType == XML_COMMENT_NODE)
                                					{
                                						echo $xpath . '/#comment: ' . $node->nodeValue;
                                					}	
                                					
                                					
                                				}
                                			}			
                                		}
                                	}
                                }
                                
                                echo "</pre>\r\n";
                                
                                $dom->saveHTMLFile('standard.save.html');
                                
                                
                                

                                Spirituelle Grüße Euer Robert

                                --
                                Möge der Forumsgeist wiederbelebt werden!
                              2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                                ja!

                                habe einen Fehlerpfad gefunden.

                                Wenn man dieselbe vorbereitete newNode innerhalb eines Durchlaufes erst für insertBefore() und anschließend für appenChild() verwendet, gewinnt der letzte INSERT, also das appenChild(). Das muss ich freilich noch genauer untersuchen, aber es wird augenscheinlich nicht mit dem Muster der neunen Node gearbeitet, sondern mit dem Original.

                                Hier folgt der Teil 2 des Ergebnisses. In ein Posting hat das leider nicht reingepasst

                                Das Ergebnis des Skriptes auf dem Screen:

                                
                                DOMElement Object
                                (
                                    [tagName] => tr
                                    [schemaTypeInfo] =>
                                    [nodeName] => tr
                                    [nodeValue] => 1-1-Eins
                                			1-1-Zwei
                                			1-1-Drei
                                		
                                    [nodeType] => 1
                                    [parentNode] => (object value omitted)
                                    [childNodes] => (object value omitted)
                                    [firstChild] => (object value omitted)
                                    [lastChild] => (object value omitted)
                                    [previousSibling] =>
                                    [nextSibling] => (object value omitted)
                                    [attributes] => (object value omitted)
                                    [ownerDocument] => (object value omitted)
                                    [namespaceURI] =>
                                    [prefix] =>
                                    [localName] => tr
                                    [baseURI] =>
                                    [textContent] => 1-1-Eins
                                			1-1-Zwei
                                			1-1-Drei
                                		
                                )
                                
                                DOMElement Object
                                (
                                    [tagName] => td
                                    [schemaTypeInfo] =>
                                    [nodeName] => td
                                    [nodeValue] => 1-1-Eins
                                    [nodeType] => 1
                                    [parentNode] => (object value omitted)
                                    [childNodes] => (object value omitted)
                                    [firstChild] => (object value omitted)
                                    [lastChild] => (object value omitted)
                                    [previousSibling] =>
                                    [nextSibling] => (object value omitted)
                                    [attributes] => (object value omitted)
                                    [ownerDocument] => (object value omitted)
                                    [namespaceURI] =>
                                    [prefix] =>
                                    [localName] => td
                                    [baseURI] =>
                                    [textContent] => 1-1-Eins
                                )
                                
                                DOMElement Object
                                (
                                    [tagName] => td
                                    [schemaTypeInfo] =>
                                    [nodeName] => td
                                    [nodeValue] => Ich bin die erste neue Node
                                    [nodeType] => 1
                                    [parentNode] => (object value omitted)
                                    [childNodes] => (object value omitted)
                                    [firstChild] => (object value omitted)
                                    [lastChild] => (object value omitted)
                                    [previousSibling] =>
                                    [nextSibling] => (object value omitted)
                                    [attributes] => (object value omitted)
                                    [ownerDocument] => (object value omitted)
                                    [namespaceURI] =>
                                    [prefix] =>
                                    [localName] => td
                                    [baseURI] =>
                                    [textContent] => Ich bin die erste neue Node
                                )
                                
                                DOM Document
                                
                                
                                /html
                                /html/head
                                /html/head/meta
                                /html/head/meta/#attrib[http-equiv]: content-type
                                /html/head/meta/#attrib[content]: text/html; charset=utf-8
                                /html/head/title
                                /html/head/title/#text: DomDocument
                                /html/head/link
                                /html/head/link/#attrib[rel]: stylesheet
                                /html/head/link/#attrib[type]: text/css
                                /html/head/link/#attrib[href]: style.css
                                /html/head/style
                                /html/head/style/#attrib[type]: text/css
                                /html/head/style/#cdata: body {
                                			font-family: century gothic, sans-serif;
                                		}
                                		
                                		img {
                                			border: 1px solid blue;
                                			padding: 5px;
                                			background-color: #30C060;
                                		}
                                		
                                		table {
                                			border: 1px solid #000000;
                                			padding: 3px;
                                			border-collapse: collapse;
                                			cell-spacing: 0;	
                                		}
                                		
                                		td {
                                			border: 1px dotted #000000;
                                			padding: 3px;
                                		}
                                /html/body
                                /html/body/#comment:  BEGINN Einleitungstext
                                /html/body/#text: Hallo, hier steht Text
                                    in zwei Zeilen mit Umbruch
                                /html/body/#comment:  ENDE Einleitungstext
                                /html/body/div
                                /html/body/div/#attrib[id]: main
                                /html/body/div/div[1]
                                /html/body/div/div[1]/#attrib[id]: left
                                /html/body/div/div[1]/p
                                /html/body/div/div[1]/p/#attrib[class]: rot
                                /html/body/div/div[1]/p/#text: Ich bin 1
                                /html/body/div/div[2]
                                /html/body/div/div[2]/#attrib[id]: center
                                /html/body/div/div[2]/h1
                                /html/body/div/div[2]/h1/#text: Ich bin 2
                                /html/body/div/div[3]
                                /html/body/div/div[3]/#attrib[id]: right
                                /html/body/div/div[3]/img
                                /html/body/div/div[3]/img/#attrib[src]: harzhexe.jpg
                                /html/body/div/div[3]/img/#attrib[alt]: Harzhexe
                                /html/body/div/a
                                /html/body/div/a/#attrib[href]: standard.doc.html
                                /html/body/div/a/#attrib[title]: hier klicken
                                /html/body/div/a/#text: Hier klicken
                                /html/body/table[1]
                                /html/body/table[1]/#attrib[id]: t001
                                /html/body/table[1]/tr[1]
                                /html/body/table[1]/tr[1]/#attrib[id]: t001-tr001
                                /html/body/table[1]/tr[1]/td[1]
                                /html/body/table[1]/tr[1]/td[1]/#attrib[class]: saldo
                                /html/body/table[1]/tr[1]/td[1]/#text: Ich bin die erste neue Node
                                /html/body/table[1]/tr[1]/td[2]
                                /html/body/table[1]/tr[1]/td[2]/#attrib[class]: c1
                                /html/body/table[1]/tr[1]/td[2]/#text: 1-1-Eins
                                /html/body/table[1]/tr[1]/td[3]
                                /html/body/table[1]/tr[1]/td[3]/#text: 1-1-Zwei
                                /html/body/table[1]/tr[1]/td[4]
                                /html/body/table[1]/tr[1]/td[4]/#attrib[class]: c1
                                /html/body/table[1]/tr[1]/td[4]/#text: 1-1-Drei
                                /html/body/table[1]/tr[1]/td[5]
                                /html/body/table[1]/tr[1]/td[5]/#attrib[class]: saldo
                                /html/body/table[1]/tr[1]/td[5]/#text: Ich bin die zweite neue Node
                                /html/body/table[1]/tr[2]
                                /html/body/table[1]/tr[2]/#attrib[id]: t001-tr002
                                /html/body/table[1]/tr[2]/td[1]
                                /html/body/table[1]/tr[2]/td[1]/#text: 1-2-Eins
                                /html/body/table[1]/tr[2]/td[2]
                                /html/body/table[1]/tr[2]/td[2]/#text: 1-2-Zwei
                                /html/body/table[1]/tr[2]/td[3]
                                /html/body/table[1]/tr[2]/td[3]/#text: 1-2-Drei
                                /html/body/br
                                /html/body/table[2]
                                /html/body/table[2]/#attrib[id]: t002
                                /html/body/table[2]/tr
                                /html/body/table[2]/tr/#attrib[id]: t002-tr001
                                /html/body/table[2]/tr/td[1]
                                /html/body/table[2]/tr/td[1]/#text: 2-2-Eins
                                /html/body/table[2]/tr/td[2]
                                /html/body/table[2]/tr/td[2]/#text: 2-2-Zwei
                                /html/body/table[2]/tr/td[3]
                                /html/body/table[2]/tr/td[3]/#text: 2-2-Drei
                                
                                
                                

                                Die Ergebnisdatei:

                                
                                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
                                <html>
                                <head>
                                <meta http-equiv="content-type" content="text/html; charset=utf-8">
                                <title>DomDocument</title>
                                <link rel="stylesheet" type="text/css" href="style.css">
                                <style type="text/css">
                                		body {
                                			font-family: century gothic, sans-serif;
                                		}
                                		
                                		img {
                                			border: 1px solid blue;
                                			padding: 5px;
                                			background-color: #30C060;
                                		}
                                		
                                		table {
                                			border: 1px solid #000000;
                                			padding: 3px;
                                			border-collapse: collapse;
                                			cell-spacing: 0;	
                                		}
                                		
                                		td {
                                			border: 1px dotted #000000;
                                			padding: 3px;
                                		}
                                	</style>
                                </head>
                                <body>
                                	<!-- BEGINN Einleitungstext -->
                                	
                                	Hallo, hier steht Text
                                    in zwei Zeilen mit Umbruch	
                                
                                	<!-- ENDE Einleitungstext -->
                                	
                                	<div id="main">
                                		<div id="left"><p class="rot">Ich bin 1</p></div>
                                		<div id="center"><h1>Ich bin 2</h1></div>
                                		<div id="right"><img src="harzhexe.jpg" alt="Harzhexe"></div>	
                                		<a href="standard.doc.html" title="hier klicken">Hier klicken</a>
                                	</div>	
                                
                                	<table id="t001">
                                <tr id="t001-tr001">
                                <td class="saldo">Ich bin die erste neue Node</td>
                                <td class="c1">1-1-Eins</td>
                                			<td>1-1-Zwei</td>
                                			<td class="c1">1-1-Drei</td>
                                		<td class="saldo">Ich bin die zweite neue Node</td>
                                </tr>
                                <tr id="t001-tr002">
                                <td>1-2-Eins</td>
                                			<td>1-2-Zwei</td>
                                			<td>1-2-Drei</td>
                                		</tr>
                                </table>
                                <br><table id="t002"><tr id="t002-tr001">
                                <td>2-2-Eins</td>
                                			<td>2-2-Zwei</td>
                                			<td>2-2-Drei</td>
                                		</tr></table>
                                </body>
                                </html>
                                
                                
                                

                                Jetzt stört mich nur noch die dusselige Formatierung in der Ergebnisdatei. Da werden doch einige Whitespaces vernichtet, wo wi noch benötigt wurden. Aber das hat ja zum Glück keinen Einfluss auf die Funktionalität.

                                Spirituelle Grüße Euer Robert

                                --
                                Möge der Forumsgeist wiederbelebt werden!
                              3. Hi ho,

                                was ist eigentlich der Unterschied zwischen nodeValue und textContent?

                                [code lang=text]

                                [nodeValue] => Tabellenzelle 1-2-Eins, lang
                                		1-2-Zwei
                                		1-2-Drei
                                	
                                [nodeType] => 1
                                [parentNode] => (object value omitted)
                                [childNodes] => (object value omitted)
                                [firstChild] => (object value omitted)
                                [lastChild] => (object value omitted)
                                [previousSibling] => (object value omitted)
                                [attributes] => (object value omitted)
                                [ownerDocument] => (object value omitted)
                                [namespaceURI] => 
                                [prefix] => 
                                [localName] => tr
                                [baseURI] => 
                                [textContent] => Tabellenzelle 1-2-Eins, lang
                                		1-2-Zwei
                                		1-2-Drei
                                

                                [/code]

                                Steht doch in beiden dasselbe drin.

                                greez Robert

                                1. Tach!

                                  was ist eigentlich der Unterschied zwischen nodeValue und textContent?
                                  Steht doch in beiden dasselbe drin.

                                  Sicher? Auch wenn andere Elemente drinstecken und du dir die Ausgabe mit htmlspecialchars() oder in der Quelltextansicht anschaust?

                                  dedlfix.

                                  1. Hi Ho lieber Dedlfix,

                                    was ist eigentlich der Unterschied zwischen nodeValue und textContent?
                                    Steht doch in beiden dasselbe drin.

                                    Sicher? Auch wenn andere Elemente drinstecken und du dir die Ausgabe mit htmlspecialchars() oder in der Quelltextansicht anschaust?

                                    Das ist jetzt die Übersicht

                                    DOMElement Object
                                    (
                                        [tagName] => td
                                        [schemaTypeInfo] => 
                                        [nodeName] => td
                                        [nodeValue] => Tabellenzelle 1-2-Eins, lang
                                        [nodeType] => 1
                                        [parentNode] => (object value omitted)
                                        [childNodes] => (object value omitted)
                                        [firstChild] => (object value omitted)
                                        [lastChild] => (object value omitted)
                                        [previousSibling] => 
                                        [nextSibling] => (object value omitted)
                                        [attributes] => (object value omitted)
                                        [ownerDocument] => (object value omitted)
                                        [namespaceURI] => 
                                        [prefix] => 
                                        [localName] => td
                                        [baseURI] => 
                                        [textContent] => Tabellenzelle 1-2-Eins, lang
                                    )
                                    

                                    zu dem HTML-Code

                                    <table id="t002">
                                    <tr id="t002-tr001">
                                    <td>2-2-Eins</td>
                                    			<td>2-2-Zwei</td>
                                    			<td>2-2-Drei</td>
                                    		</tr>
                                    <tr id="t001-tr002">
                                    <td>Tabellenzelle <strong>1-2-Eins</strong>, lang</td>
                                    			<td>1-2-Zwei</td>
                                    			<td>1-2-Drei</td>
                                    		</tr>
                                    </table>
                                    

                                    Die falschen™ IDs rühren davon, dass ich die Zeile von Tabelle 001 nach Tabelle 002 verschoben habe, und es das Reindizieren noch nicht gibt.

                                    Aber wie man sieht, ist in nodeValue nix sieht von <strong>

                                    chiao Roberto

                                    1. Also, das mit den fehlenden Zeilenumbrüchen in der Ansicht ist absolutamente merda!

                                      1. Tach!

                                        Also, das mit den fehlenden Zeilenumbrüchen in der Ansicht ist absolutamente merda!

                                        Du solltest die neue Syntax beachten. [code...] ist nicht mehr. Code-Blöcke werden nun in Leerzeile und ~~~ sowie ~~~ und Leerzeile eingerahmt. Das Symbol </> über dem Eingabefeld fügt das auch ein.

                                        dedlfix.

                                    2. Tach!

                                      was ist eigentlich der Unterschied zwischen nodeValue und textContent?
                                      Steht doch in beiden dasselbe drin.

                                      Sicher? Auch wenn andere Elemente drinstecken und du dir die Ausgabe mit htmlspecialchars() oder in der Quelltextansicht anschaust?

                                      Also, in nodeValue steckt doch nicht das drin, was ich erst vermutete. Jedenfalls, das Internet wusste die Antwort. nodeValue kann sich ändern, je nach Typ des Nodes. Meist ist es jedoch derselbe Inhalt. textContent hingegen garantiert, dass darin der Textinhalt des Nodes und aller seiner Kinder drinsteht.

                                      dedlfix.

                                    3. Moin,

                                      huch bist du das auf dem Bild? Da bekomme ich ja schon fast ein schlechtes Gewissen „du“ zu sagen. Ich mach mir ja immer so meine Gedanken wer hinter einem Profil stecken könnte, bei dir dachte ich an einen jungen Kerl, um die 20 / 25 :)

                                      1. Hi Ho lieber Mitdenker,

                                        ich hab das Rentenalter schon lange erreicht - 67. Nur Rente hab ich keine. So muss ich denn noch für ein paar Chefs arbeiten. Die sind alle jünger als ich - so zwischen 30 und 40.

                                        Spirituelle Grüße Robert

                              4. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                                ja!

                                nachdem ich jetzt so einigermaßen das Prinzip der Klasse verstanden habe, habe ich mich mit vorsichtigigen Gehversuchen an das Testen der Härte der Klasse herangewagt.

                                Leider lässt sich sich noch verarschen - oder ich habe einen Schalter oder eine Methode noch nicht entdeckt. Soll heißen:

                                Ich baue eine neue <td>-Node auf und füge die dann kackfrech direkt in ein <table>-Element ein. Das ist für HTML4.x zumindest nicht erlaubt, wenn ich mich recht erinnere. Es bringt den Browser auch nett durcheinander. Die DTD ist pflichtgemäß im Document angegeben und die wird auch bei der Methode [link:http://php.net/manual/en/domdocument.validate.php] DOMDocument::validate() benutzt, auch wenn die noch Unsinn produziert (hab ich noch nicht näher untersucht).

                                Wenn ich nichts übersehen habe, wie fange ich jetzt am besten an, um der Klasse die geforderte Härte anzuerziehen? Das einfachste wäre, eine Methode einzufügen, die die Prüfung durchführt und den Manipulationsmehtoden beizubringen, dass sie diese zu befragen haben, bevor sie die Manipulation durchführen.

                                Mir würde es genügen festzustellen, ob das Element an dieser Stelle im Parent-Element vorkommen darf. Das ließe sich ja mit einigen Mustern realisieren . Ich müsste dazu im Prinzip nur die HTML-Doku abschreiben, aus der man (zumindest früher) immer gut sehen konnte, welche Elternelemente erlaubt sind, bzw. welche Kindelemente erlaubt sind.

                                Das müsste dann zumindest für HTML-4.1 und sicherlich auch für HTML-5 (puh) gemacht werden.

                                Aber wie schon gesagt, vielleicht habe ich doch einfach nur etwas übersehen und es gibt diesen Mechanismus schon in der Klasse.

                                Der zweite Akt wäre dann, die Klassensammlung an einer passenden Stelle zu erweitern.

                                Ist meine Idee so zielführend, oder ist sie Quatsch?

                                Spirituelle Grüße
                                Euer Robert

                                --
                                Möge der wahre Forumsgeist ewig leben!
                                1. Tach!

                                  Ich baue eine neue <td>-Node auf und füge die dann kackfrech direkt in ein <table>-Element ein. Das ist für HTML4.x zumindest nicht erlaubt, wenn ich mich recht erinnere.

                                  Das ist ja auch keine HTML-DOM-Klasse, sondern eine ganz allgemeine für XML mit zwei Zusatzfunktionen zum Lesen und Speichern von HTML. Du erwartest zu viel.

                                  Das müsste dann zumindest für HTML-4.1 und sicherlich auch für HTML-5 (puh) gemacht werden.

                                  HTML 4? würde ich lassen, wenn du das nicht explizit für Uralt-Browser brauchst. Jedenfalls war die HTML-4.01-DTD noch recht übersichtlich, abgesehen von Eigenheiten, die nicht mit der DTD darstellbar waren. HTML5 hat gleich gar keine DTD mehr bekommen, weil es gefühlt mehr Ausnahmen als Regeln gibt.

                                  Ist meine Idee so zielführend, oder ist sie Quatsch?

                                  Für welches Ziel eigentlich? Im OP stand nur was von einem Parser, jetzt willst du sogar schon valide (zumindest funktionsfähige) HTML-Dokumente erstellen.

                                  dedlfix.

                                  1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                                    ja!

                                    Ist meine Idee so zielführend, oder ist sie Quatsch?

                                    Für welches Ziel eigentlich? Im OP stand nur was von einem Parser, jetzt willst du sogar schon valide (zumindest funktionsfähige) HTML-Dokumente erstellen.

                                    Klar. Das war ja auch erst die zwingende Voraussetzung für das eigentliche Vorhaben. Das entwickelt sich auch erst langsam. Als nächsten Milestone sollte es möglich sein, valide HTML-Rohdokumente mit Daten zu füllen und z.B. bei Repetitions die Elemente (Listen, Tabellen, usw.) valide anpassen zu können.

                                    Der Ersteller des HTML-Dokumentes stellt auf seinem Server ein Template (oder eben sein Rohdukument) ohne Daten zur Verfügung, fordert per Request die passenden Daten dafür an, bekommt aber nicht nur rohe Daten, sondern das fertig aufbereitete HTML-template zurück und kann dies in sein Dokument einfach einbauen.

                                    Ich brauche das für eine Syndication-Lösung, bei der die Teilnehmer sich von irgendwoher fertige Templates beschafft haben, und diese nun zusammen mit den gemeinsamen Daten nutzen wollen. Manche Daten liegen zentral, manche beim Teilnehmer. Keiner hat direkten Zugriff auf die Daten des Anderen.

                                    Spirituelle Grüße
                                    Euer Robert

                                    --
                                    Möge der wahre Forumsgeist ewig leben!