XMLReader: Original Tag ausgeben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XMLReader: Original Tag ausgeben

    Hallo zusammen,

    Ich habe mal wieder eine Frage. Und zwar lese ich mit XMLReader ein XHTML-Dokument ein.

    Jetzt kommt es teilweise vor, dass ich gerne meine Tags wieder so zurück bekomme wie XMLReader die gelesen hat. Der zerpflückt die ja dann für sich in "Attributes", "LocalName", "Prefix", usw.

    Gibt es eine einfache Möglichkeit wie ich wieder den aktuellen Tag zusammengesetzt bekomme vom Reader, so wie er gelesen wurde?

    Wenn im Original folgender Tag stand:
    Code:
    <body id="no-js">
    möchte ich wieder per: $xmlReader->{method?}

    wieder folgendes bekommen:
    Code:
    <body id="no-js">
    Hab es schon versucht mit expand() und dann das DOMElement irgendwie wieder so zurückzubekommen, aber da hab ich auch nichts gefunden...

    Kann mir da jemand weiter helfen ? Wäre echt super .

  • #2
    Hallo,

    wenn du nur ein einzelnes Tag haben willst, kommst du am besten, wenn du es dir selbst wieder zusammenbaust. Wenn du dagegen den XML-Code für ein ganzes Element haben möchtest (öffnendes Tag, Inhalt, schließendes Tag), kannst du die Methode readOuterXML() verwenden.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Danke für deine Antwort.

      Ja das selbst zusammenbauen habe ich versucht, scheiterte aber daran, dass ich den Namen der Attribute nicht mehr herausfand. Ich kann zwar mit getAttributeNo() ein bestimmtes Attribut ziehen, aber bekomme immer nur den Value zurück und nie den Namen...

      Also bei
      Code:
      <body class="no-js">
      Bekomme ich "no-js" zurück. Aber wie komme ich an den Namen "class" ran?

      Kommentar


      • #4
        Hmmm...
        Warum verwendest du nicht DOM, wenn dir der Reader nicht reicht?
        Wir werden alle sterben

        Kommentar


        • #5
          Mit DOM hab ichs auch schon versucht, aber da steh ich auch an. Es handelt sich um folgendes XHTML-File:

          HTML-Code:
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
              "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
          <html xmlns:tst="http://www.google.ch/">
          	<head>
          		<title>Test</title>
          	</head>
          	<body class="no-js">
          		<h1>Newest news</h1>
          		<p><tst:text value="info" /></p>
          		<tst:for value="foo" var="bar">
          			<h2><tst:text value="bar[title]" /></h2>
          			<p><tst:text value="bar[content]" /></p>
          			<hr />
          		</tst:for>
          		
          		<script type="text/javascript">
          			function helloWorld() {
          				alert('hello world');
          			}
          		</script>
          	</body>
          </html>
          Ich versuche das mit folgendem Code mal zu laden:

          Code:
          $this->domReader = new DOMDocument();
          $this->domReader->loadHTMLFile($tplFile);
          $this->tplNameSpace = 'tst';
          		
          var_dump($this->domReader->getElementsByTagNameNS('http://www.google.ch/','tst'));
          Aber das wirft den Fehler:

          Code:
          Notice: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: 
          Namespace prefix tst is not defined in template.html, line: 
          11 in C:\xampp\htdocs\tagmania\TemplateEngineDOM.class.php on line 13

          Kommentar


          • #6
            Die Methode loadHtmlFile() lädt eine HTML-4.0-Datei. Um XHTML zu laden, musst du loadXmlFile() benutzen.

            Der zweite Fehler liegt in der Benutzung der getElementsByTagNameNS()-Methode. Die zweite Parameter gibt den localName an, nicht das NS-Präfix. Wenn du alle Elemente in diesem Namespace finden willst, musst du "*" als zweiten Parameter angeben. Wenn du dort z. B. "for" schreibst, findet es alle tst:for-Elemente. Mit "tst" findet es gar nichts, weil es im Dokument kein Element tst:tst gibt.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Okay danke . Da hätte ich auch selbstr drauf kommen müssen.

              Hab es nun geschafft. Jetzt habe ich mal eine Grundsätzliche Frage: Was eignet sich am besten für folgendes Szenario:

              "Ich möchte alles des geladenen (X)HTML-Files normal ausgeben, ausser bei den <tst:*>-Tags muss ich bestimmte Aktionen auslösen die dann neues XML generieren, das dann den <tst:*>-Tag inkl. dessen Inhalt ersetzt."

              Beim XMLReader-Ansatz hatte ich das so, dass ich einfach den XmlReader->prefix überprüft habe und wenn der nicht "tst" war hab ich das Element dann normal ausgegeben. Aber z.B. Kommentare im Template-File wurden entkommentiert, ich kann den DOCTYPE nicht mehr ausgeben und weshalb ich schrieb: die Attribute müsste ich mühsam wieder zusammensetzen, usw...
              Zuletzt geändert von pascal007; 10.11.2011, 10:14.

              Kommentar


              • #8
                Ich würde XSL-T benutzen, um das Dokument zu transformieren.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Also das heisst ich würde das HTML-Dokuemnt als XML in ein DOMDocument einlesen. Dann die manipulationen machen (<tst:*>-Tags löschen und dafür das neue, generierte XML einsetzen) und dann das modifizierte XML mit XSLT wieder in ein HTML-Dokument "umstylen"?

                  Kommentar


                  • #10
                    Eigentlich meinte ich es anders. Ich gehe einfach mal davon aus, das alles in dem Namespace http://www.google.ch/ irgendwelcher Template-Kram ist, den du dir selbst ausgedacht hast. Wenn das stimmt, hast du versucht, XSL-T selbst nachzubauen, was eigentlich Zeitverschwendung ist. Lösung: Nimm gleich XSL-T als Template-Sprache.

                    Wenn ich mich irre, erklär bitte einfach mal, woher die Elemente dieses Namespace kommen und wofür sie gut sind.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Ja das scheine ich in dem Fall versucht zu haben. Ziel ist es eine leichte TemplateEngine zu schreiben die mit "Custom Tags" Arbeitet (wie in JSF).

                      Also die Idee ist, dass man ein normales HTML-File schreibt und Custom-Tags mit einem Namespace kennzeichnet (eben z.B. "tst"). Dann sollen die <tst:*>-Tags durch generierten Inhalt abgelöst werden.

                      Bei dem For-Tag wird durch ein Array ("foo") durchgelaufen und der Code in dem Tag so oft neu gefüllt und ausgegeben wie das Array Inhalte hat.

                      Mein For-Tag ist eigentlich folgender PHP-Code:

                      Code:
                      <?php
                      
                      $foo = array(...);
                      
                      foreach($foo as $bar) {
                          echo 'htmlcode hier';
                      }
                      
                      ?>
                      Das Problem an XSLT... ich möchte wirklich ganz normales HTML (plus meine Custom Tags mit entsprechendem Namespace) schreiben (ohne xslt-Anweisungen zwischen dem HTML-Code)...

                      Kommentar


                      • #12
                        Zitat von pascal007 Beitrag anzeigen
                        Das Problem an XSLT... ich möchte wirklich ganz normales HTML (plus meine Custom Tags mit entsprechendem Namespace) schreiben (ohne xslt-Anweisungen zwischen dem HTML-Code)...
                        Das schöne an XSLT… du kannst wirklich ganz normales HTML (plus XSLT-Tags mit entsprechendem Namespace) schreiben (denn so wie es jetzt aussieht, sind deine Custom Tags genau die, die XSLT schon eingebaut hat)…

                        Falls nicht, kannst du deine Templates (HTML + Custom Tags) durch XSLT jagen, ohne das Dokument vorher mit DOM manipulieren zu müssen.
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          Das ist mir jetzt ein bisschen abstrakt, sorry wenn ich da nicht gleich nachkomme.

                          Also die Idee ist, dass es dann auch noch andere Tags gibt und das man für beliebige Aufgaben Tags schreiben kann (auch solche die XSLT nicht beherrscht).

                          Weil wenn meine Template-Klasse nun ein öffnendes <tst:*>-Element findet passiert folgendes (noch mit XMLReader):

                          PHP-Code:
                          if($this->xmlReader->nodeType == XmlReader::ELEMENT) {
                                          echo
                          "open tpl element: ",$this->xmlReader->localName,"\n";
                                          
                                          
                          $tagClassName ucfirst($this->xmlReader->localName) . 'Tag';
                                          
                                          if(!
                          class_exists($tagClassName))
                                              throw new 
                          TemplateEngineException("Der Tag '" $tagClassName "' ist nicht vorhanden");
                                          
                                          
                          $tag = new $tagClassName;
                                          
                                          if(!
                          $this->xmlReader->isEmptyElement)
                                              
                          self::addPendingTag($this->xmlReader->localName);
                                          
                                          
                          $parseBuff .= $tag->replace($this);
                                          
                                          continue;
                                      } 
                          in folgendem Methode-Call:

                          Code:
                          $tag->replace($this);
                          Kann ich nun schreiben was der Tag machen soll. Ich könnte da auch aufgrund von einer $_SESSION-Variabel bestimmtes HTML-Ausgeben... z.B.:

                          PHP-Code:
                          public function replace(TemplateEngine $tplEngine) {
                              if(
                          $_SESSIOM['loggedin']) {
                                  return 
                          '';
                              } else {
                                  return 
                          '<form method="post" action="?login">
                                      Username: <input type="text" value="" name="username" />
                                      Password: <input type="password" value="" name="password" />
                                      <input type="submit" value="Anmelden" />
                                  </form>'
                          ;
                              }

                          Zuletzt geändert von pascal007; 10.11.2011, 11:04.

                          Kommentar


                          • #14
                            Ich hab nichts dagegen, dass du das mit PHP machen willst. Ich wollte dir nur vermitteln, dass XSL-T das auch alles kann.

                            Manche Dinge (z. B. Stringoperationen) sind mit XSLT alleine ziemlich umständlich, das geb ich zu. Dafür kann man aber PHP-Funktionen bzw. -Methoden registrieren und aufrufen (XsltProcessor::registerPhpFunctions()).

                            Vermutlich sind deine XSLT-Kenntnisse noch nicht so umfangreich und du willst dich mit PHP lieber auf sicherem Terrain bewegen. Das ist völlig in Ordnung. Trotzdem lohnt es sich, einen genaueren Blick auf XSLT zu werfen, denn ich habe den Eindruck, dass du gerade dabei bist, dieses Rad neu zu erfinden, was dich später vielleicht mal ärgern könnte. Ich spreche da aus eigener Erfahrung.
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar


                            • #15
                              Ja das ist super :-). Du hast recht.... meine XSLT-Kenntnisse sind nahe 0 (nur mal kurz im Unterricht angeschnitten) ;-).

                              Aber ich werde das Gefühl nicht los, dass es mit XSLT komplizierter wird als wenn ich das selbst in PHP versuche zu schreiben und ich seh das dann einfach als Übung :-).

                              Aber eben: Was mach ich jetzt? Ich möchte einfach meine Custom-Tags durch das (X)HTML ersetzen das die "replace()"-Methode von dene generiert und rest des HTML-Dokuments 1:1 ausgeben... aber wie?

                              (Wenn du Zeit hast und meine Situation in einem kurzen abstrakten XSLT-PHP-Beispiel erläutern könntest, würde ich evtl. auch noch auf den XSLT-Geschmack kommen ;-)).
                              Zuletzt geändert von pascal007; 10.11.2011, 11:22.

                              Kommentar

                              Lädt...
                              X