Andreas: Unterschied zwischen HTML Element und XML Node mit HTML-Tag(s)?

Nachdem ich recht erfolglos rumbastle an einer Loesung zur Aufgabe, einen Element auf meiner Seite regelmaessig durch ein (fast gleiches) Element zu ersetzen, moechte ich mal folgende Frage stellen:

Kann es sein, dass Firefox/Gecko/der DOM Standard allgemein unterscheiden zwischen echten HTML-Element-Knoten, wie sie z.B. von einer Seite mit Endung *.html und Content-Type text/html kommen und XML-Nodes, die aus einem XML-Fragment mit *.xml Endung per XMLHttpRequest vom Server nachgeladen werden, die aber "rein zufaellig" nur aus HTML-Tags/Attributen bestehen, elementar unterscheidet?

Kann es sein, dass Firefox/Gecko letztere nicht als HTML darstellt, sondern irgendwie nur die Texte der Text-Knoten und alle Tags ignoriert (also keinerlei Layout)? Auch wenn das ganze in den DOM einer HTML-Seite eingebaut wird, die amsonsten einwandfrei dargestellt wird?

Wenn das so ist, wie kann ich einen XML-Node mit HTML-Tags konvertieren in ein waschechtes HTML-Element?

Wie deklariere ich ein XML auf dem Server (also in der textuellen Form) so, dass es zwar ein HTML-Fragment ist aber kein gueltiges komplettes HTML-Dokument (es ist nur ein div)?

Gruss,

Andreas

  1. Hallo,

    bitte bleibe das nächste Mal bei Folgefragen in deinem ursprünglichen Thread.

    Wenn das so ist, wie kann ich einen XML-Node mit HTML-Tags konvertieren in ein waschechtes HTML-Element?

    Du musst den Namespace der Elemente angeben, sonst sieht Firefox sie nicht als (X)HTML-Elemente an.

    Wie deklariere ich ein XML auf dem Server (also in der textuellen Form) so, dass es zwar ein HTML-Fragment ist aber kein gueltiges komplettes HTML-Dokument (es ist nur ein div)?

    <?xml version="1.0" encoding="utf-8" ?>
    <strong xmlns="http://www.w3.org/1999/xhtml">bla</strong>

    Wenn du das Dokument per XMLHttpRequest einliest und den Elementknoten in dein Dokument überführst (cloneNode oder importNode, wie gesagt), sollte Firefox die Semantik des Elements erkennen.

    Mathias

    1. Wenn das so ist, wie kann ich einen XML-Node mit HTML-Tags konvertieren in ein waschechtes HTML-Element?

      Du musst den Namespace der Elemente angeben, sonst sieht Firefox sie nicht als (X)HTML-Elemente an.

      Danke fuer die Antwort!

      Da ich im Moment fuer die Seite noch kein XHTML sondern noch HTML 4.01 verwende: Hat das auch einen Namespace, den ich zuweisen kann. Ist es auch moeglich, den Namespace nicht schon in der textuellen Form, die ich ja auch fuer den "server side include" verwende, sondern erst programmatisch durch JavaScript vorzunehmen?

      Gruss,

      Andreas

      1. Da ich im Moment fuer die Seite noch kein XHTML sondern noch HTML 4.01 verwende: Hat das auch einen Namespace, den ich zuweisen kann.

        Noch eine Anmerkung: Mir ist bewusst, dass es sich mit HTML nicht um einen XML-Dialekt, sondern einen SGML-Dialekt handelt, der wohl keine Namespaces kennt. Andererseits konvertieren die Browser ja auch das HTML intern in einen DOM um. Da es eben genau in diesem DOM das von mir beschriebene Problem gibt und das laut Mathias am falschen/nicht existenten Namespace des eingefuegten Nodes liegt, wuesste ich gerne, welchen Namespace ich hier zuweisen muss. In der HTML Spec steht jedenfalls nichts drin.

        Gruss,

        Andreas

      2. Hallo,

        Da ich im Moment fuer die Seite noch kein XHTML sondern noch HTML 4.01 verwende: Hat das auch einen Namespace, den ich zuweisen kann.

        Du kannst wie beschrieben XHTML-Elemente (= Elemente des XHTML-Namespaces) in ein HTML-Dokument importieren. Eine Änderung des Namespaces von XHTML zu HTML musst du nicht vornehmen, und möglich ist es wie du sagst sowieso nicht.

        Ist es auch moeglich, den Namespace nicht schon in der textuellen Form, die ich ja auch fuer den "server side include" verwende, sondern erst programmatisch durch JavaScript vorzunehmen?

        Nein, nicht dass ich wüsste. Die namespaceURI-Eigenschaft eines Knotens ist nur lesbar. Inwiefern stört die xmlns-Angabe?

        Mathias

        1. Hallo,

          Da ich im Moment fuer die Seite noch kein XHTML sondern noch HTML 4.01 verwende: Hat das auch einen Namespace, den ich zuweisen kann.

          Du kannst wie beschrieben XHTML-Elemente (= Elemente des XHTML-Namespaces) in ein HTML-Dokument importieren. Eine Änderung des Namespaces von XHTML zu HTML musst du nicht vornehmen, und möglich ist es wie du sagst sowieso nicht.

          Hmmm, wenn das Dokument ein HTML-Dokument ist, dann funktioniert das ganze irgendwie nicht (selbes Problem wie vorher). Mit XHTML funktioniert es aber. Ich ueberlege jetzt, die Seite gleich komplett auf XHTML umzustellen. Ich habe aber Angst, dass es dann irgendwo an der Kompatibilitaet klemmt.

          Ist es auch moeglich, den Namespace nicht schon in der textuellen Form, die ich ja auch fuer den "server side include" verwende, sondern erst programmatisch durch JavaScript vorzunehmen?

          Nein, nicht dass ich wüsste. Die namespaceURI-Eigenschaft eines Knotens ist nur lesbar. Inwiefern stört die xmlns-Angabe?

          Eben wegen dem Server Side Include: Es scheint mir nicht sauber, wenn ein HTML-Fragment, welches in das HTML-Dokument included wird, ploetzlich eine Namespace-Anweisung enthaelt. Und tatsaechlich: Firefox stellt das dann nicht richtig dar.

          Also vielleicht nochmal zum Verstaendnis: Ich include das Fragment fuer die erste Seitenaufbereitung auf dem Server in die Seite und liefere das Dokument komplett zum Client aus. Der Client holt sich in periodischen Abstaenden nur das Fragement vom Server und tauscht es dann direkt in seinem Dokument aus.

          Gruss,

          Andreas

          1. Hallo,

            Du kannst wie beschrieben XHTML-Elemente (= Elemente des XHTML-Namespaces) in ein HTML-Dokument importieren. Eine Änderung des Namespaces von XHTML zu HTML musst du nicht vornehmen, und möglich ist es wie du sagst sowieso nicht.

            Hmmm, wenn das Dokument ein HTML-Dokument ist, dann funktioniert das ganze irgendwie nicht (selbes Problem wie vorher). Mit XHTML funktioniert es aber.

            Wir reden von Firefox? Das funktioniert hier in Firefox 1.0.2 problemlos: In einem HTML-Dokument (Endung .html, MIME-Typ text/html) läuft das Script und importiert den Knoten über XMLHttpRequest aus einem XML-Dokument (Endung .xml, MIME-Typ application/xml), der eine xmlns-Angabe hat.

            Ich ueberlege jetzt, die Seite gleich komplett auf XHTML umzustellen.
            Ich habe aber Angst, dass es dann irgendwo an der Kompatibilitaet klemmt.

            Ich kann mir höchstens vorstellen, dass Firefox einen Unterschied macht, wenn das XHTML-Dokument als application/xhtml+xml ausgeliefert wird, nicht als text/html. Und das geht nicht so ohne weiteres, den MIME-Typ unterstützen nicht alle relevanten Browser.

            Ich include das Fragment fuer die erste Seitenaufbereitung auf dem Server in die Seite und liefere das Dokument komplett zum Client aus. Der Client holt sich in periodischen Abstaenden nur das Fragement vom Server und tauscht es dann direkt in seinem Dokument aus.

            Mir würde nur einfallen, den Code über request.responseText auszulesen und über innerHTML ins Dokument zu schreiben, wie im anderen Thread angesprochen. Hast du das einmal probiert?
            Zur Not geht es sicher Old-School mit einem iframe. ;)

            Mathias

            1. Wir reden von Firefox? Das funktioniert hier in Firefox 1.0.2 problemlos

              Ja, Firefox 1.0.2. Ich bin jetzt aber gerade schon dabei die ganze Seite auf XHTML umzustellen. Ist eigentlich sowieso mal an der Zeit.

              Mir würde nur einfallen, den Code über request.responseText auszulesen und über innerHTML ins Dokument zu schreiben, wie im anderen Thread angesprochen. Hast du das einmal probiert?

              Hab ich probiert, das verdoppelt aber den Knoten (er wird ja dann in sich selbst gehaengt). Noetig waere hier eigenlich outerHTML, was auf IE wunderbar funktioniert hat, jedoch unter Gecko nicht.

              Gruss,

              Andreas

              1. Hab ich probiert, das verdoppelt aber den Knoten (er wird ja dann in sich selbst gehaengt).

                Dann nimmt man ein div- oder span-Containerelement und wendet innerHTML darauf an...?

                Mathias