Oli: Namespaces und Gültigkeit von Dokumenten

Guten Abend!

Ich beschäftige mich momentan im Anfängerstadium mit XML. Was ich bis jetzt noch nicht ganz begriffen habe, ist der Zusammenhang von der Gültigkeit von XML-Dokumenten und dem Auftreten von Namensräumen: In einem Buch (XML Professional, den genauen Titel weiß ich leider nicht mehr) erinnere ich mich gelesen zu haben, sobald ein Namespace-Attribut in einem Dokument vorkommt, sei dieses nicht mehr gültig. Ist dem tatsächlich so? Ein Bekannter meint, in einem gültigen XML-Dokument dürften Namespace-Attribute lediglich in Dokumenten vorkommen, die für die Struktur des Dokumentes überflüssig sind.

Ich würde mich freuen, wenn hier jemand Rat geben könnte.

Beste Grüße

Oli

  1. Guten Abend!

    Hi Oli,

    Ein Bekannter meint, in einem gültigen XML-Dokument dürften Namespace-Attribute lediglich in Dokumenten vorkommen, die für die Struktur des Dokumentes überflüssig sind.

    ?? kann der formulierung nicht ganz folgen: wieso sollten man etwas angeben, das überflüssig ist?!

    Namespaces dienen (u.a.) dazu, *gleichnamige* Elemente mit unterschiedlicher *Bedeutung* voneinander zu trennen und wenn das mal nix mit Struktur zu tun hat, weiß ich auch nicht.
    Anhand des Namespaces (z.B. html:h1) können parser und processor feststellen, was für das/mit dem Element zu tun ist, im Falle von HTML:H1 z.B. einen grossen, fetten Text auszugeben - entsprechendes Stylesheet vorausgesetzt - und natürlich ob dein XML-Code gültig ist.

    Wenn Du also mehrere Namespaces in Deinem XML-Dokument angibst, kannst du alle durch sie definierten Elementnamen in genau diesem Dokument verwenden: unter Hinzunahme des jeweiligen Namespaces und Berücksichtigung der erlaubten "Verschachtelung".

    Durch die Verwendung von Namespaces "erspart" man sich im Grunde (auch) das Erstellen dicker, fetter DTDs (mit allen Elementen+Attributen).

    Hope this helps

    CirTap

  2. Hallo Oli,

    Ich beschäftige mich momentan im Anfängerstadium mit XML. Was ich bis jetzt noch nicht ganz begriffen habe, ist der Zusammenhang von der Gültigkeit von XML-Dokumenten und dem Auftreten von Namensräumen: In einem Buch (XML Professional, den genauen Titel weiß ich leider nicht mehr) erinnere ich mich gelesen zu haben, sobald ein Namespace-Attribut in einem Dokument vorkommt, sei dieses nicht mehr gültig. Ist dem tatsächlich so?

    Nicht ganz.
    Richtig ist allerdings, dass Gültigkeit und der Gebrauch von Namespaces in gewissem Sinne kollidieren.
    Hast du ein gültiges XML-Dokument und möchtest nun in diesem Dokument z.B. XHTML-Tags verwenden, dann gibst du den Namensraum für XHTML an und baust die XHTML-Element ein. Folge ist aber, dass dein Dokument dann nicht mehr gültig ist, da diese Element nirgendwo deklariert wurden.Die URIs zur Namensraumdefinition verweisen auf keine DTD, die ein Parser laden könnte, um dort die Deklarationen für die hinzugefügten XHTML-Elemente zu finden. Sie dienen lediglich als eindeutige Bezeichnung.[*] Es ist auch nicht möglich zwei DTDs anzugeben (zwei Dokumenttyp-Deklarationen) für ein XML-Dokument.
    Einziger Ausweg: Deklaration der hinzugefügten Elemente in deiner DTD (mit Namensraumpräfix). Aber was machst du, wenn du mittels externer Entity ein XML-Fragment einbindest, welches Elemente enthält, die du nicht kennst und die auch nicht aus deiner DTD stammen?

    Gültigkeit und Namensräume sind also für sich genommen beide sinvolle Konzepte, aber in Verbindung kanns problematisch werden. XML-Schema schafft dort Abhilfe.

    [*] Interessant zu diesem Thema übrigens RDDL: http://www.xml.com/pub/a/2001/02/28/rddl.html

    Gruß
    Franz

    1. Hallo Franz,

      Nicht ganz.
      Richtig ist allerdings, dass Gültigkeit und der Gebrauch von Namespaces in gewissem Sinne kollidieren.

      sagen wir auch warum:
      weil in einer DTD, die in BNF (Backus-Naur-Form) notiert wird, erlaubt keine formen wie <!ELEMENT hmtl:h1 (#PCDATA)>

      Es ist auch nicht möglich zwei DTDs anzugeben (zwei Dokumenttyp-Deklarationen) für ein XML-Dokument.

      zumindest nicht mit <!DOCTYPE>
      aber so:
      <!ELEMENT combo (A, X)>
      <!ENTITY % dtd_start SYSTEM "http://www.foo.com/start.dtd">
      <!ENTITY % dtd_end SYSTEM "http://www.foo.com/end.dtd">
      %dtd_start;
      %dtd_end;

      Einziger Ausweg: Deklaration der hinzugefügten Elemente in deiner DTD (mit Namensraumpräfix).

      genau das geht nicht. siehe oben.

      Grüße
      Thomas

      1. Hallo Thomas,

        sagen wir auch warum:
        weil in einer DTD, die in BNF (Backus-Naur-Form) notiert wird, erlaubt keine formen wie <!ELEMENT hmtl:h1 (#PCDATA)>

        Nein, sowas geht durchaus, probier es mal aus.

        Es ist auch nicht möglich zwei DTDs anzugeben (zwei Dokumenttyp-Deklarationen) für ein XML-Dokument.

        zumindest nicht mit <!DOCTYPE>
        aber so:
        <!ELEMENT combo (A, X)>
        <!ENTITY % dtd_start SYSTEM "http://www.foo.com/start.dtd">
        <!ENTITY % dtd_end SYSTEM "http://www.foo.com/end.dtd">
        %dtd_start;
        %dtd_end;

        ja, das ist tricky ;-)

        Einziger Ausweg: Deklaration der hinzugefügten Elemente in deiner DTD (mit Namensraumpräfix).

        eben doch, z.B. auch in der XML-Spec selbst (xml:space):
        http://www.w3.org/TR/REC-xml.html#sec-white-space

        Gruß
        Franz

        1. Hallo Franz,

          sagen wir auch warum:
          weil in einer DTD, die in BNF (Backus-Naur-Form) notiert wird, erlaubt keine formen wie <!ELEMENT hmtl:h1 (#PCDATA)>

          Nein, sowas geht durchaus, probier es mal aus.
          eben doch, z.B. auch in der XML-Spec selbst (xml:space):
          http://www.w3.org/TR/REC-xml.html#sec-white-space

          stimmt.
          jetz möchte ich nur wissen, was ich da durcheinander gebracht habe? [frage ist rhetorisch gemeint] *g*

          grüße
          thomas