Philipp Hasenfratz: DTD Auszeichnungs(lücke|problem)

Halihallo Forumer

In der Vorlesung gab es eine "hitzige" Diskussion zu folgendem Thema:

--auswahl.dtd--
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT auswahl (#PCDATA|name)*>
<!ELEMENT name (#PCDATA)>
--

Wir haben das Root-Element "auswahl", welches 0 oder mehrfach das Element "name" oder
PCDATA enthalten kann. Ein "gemsichtes" Inhaltsmodell.

folgende XML-Instanz wäre valide bezgl. dieser DTD:
--auswahl1.xml--
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE auswahl SYSTEM "auswahl.dtd">
<auswahl>test<name>test</name>test</auswahl>
--

und ebenso:

--auswahl2.xml--
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE auswahl SYSTEM "auswahl.dtd">
<auswahl></auswahl>
--

* bedeutet (0,n), das Element name wie PCDATA müssen also nicht zwingend vorkommen. Aber:
Was wenn dies gewollt ist? - Was, wenn name oder PCDATA mindestens einmal vorkommen
soll? - Der Versuch über <!ELEMENT auswahl (#PCDATA|name)+> (für (1,n)) bricht mit
einem Fehler ab "File not well-formed; % expected.".

Gesucht ist also

a) eine DTD, welche <auswahl></auswahl> verbietet, bzw. ein _mindestens_ einmaliges
   Auftreten von name oder PCDATA erlaubt.
b) eine Erklärung, warum (#PCDATA|name)+ Konstruktionen nicht well-formed sind
   (es sei eine "Konvention", wurde uns gesagt. OK, aber das ist keine Erklärung dafür,
    dass es mit '+' nicht auch funktionieren sollte|könnte)

Viele Grüsse

Philipp und hoffentlich auch stellvertretend für andere, die sich mit der selben Frage
"quälen".

--
RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
  1. Gesucht ist also

    a) eine DTD, welche <auswahl></auswahl> verbietet, bzw. ein _mindestens_ einmaliges
       Auftreten von name oder PCDATA erlaubt.

    Geht nicht.

    b) eine Erklärung, warum (#PCDATA|name)+ Konstruktionen nicht well-formed sind

    Weil das in XML 1.0 so festgelegt ist.

    1. Halihallo Björn

      a) eine DTD, welche <auswahl></auswahl> verbietet, bzw. ein _mindestens_ einmaliges
         Auftreten von name oder PCDATA erlaubt.
      Geht nicht.
      b) eine Erklärung, warum (#PCDATA|name)+ Konstruktionen nicht well-formed sind
      Weil das in XML 1.0 so festgelegt ist.

      Danke für die eindeutige Antwort.

      These: Auszeichnungsproblem wird zur Auszeichnungslücke. Mir scheint dies ist ein Fehler
             im Konzept.

      Wenn ich eine XML-Datei vorliegen habe, dazu eine DTD, dann möchte ich die XML-Datei
      zuerst auf wellformed überprüfen, sie dann dem Validator übergeben. Wenn dieser abbricht,
      kann ich davon ausgehen, dass irgendwo ein Verstoss gegen die DTD vorliegt, was in dem
      genannten Beispiel nicht geschieht. Nun, ich sehe einen grossen Vorteil am Validieren
      bezgl. einer DTD darin, dass man als Developer die Daten schnell weiterverarbeiten kann,
      ohne darauf zu achten, ob die Daten richtig strukturiert vorliegen; ellenlange Analysen
      und Testprozeduren, ob dieses oder jenes Element an der Stelle valide ist, fällt weg.
      Wenn also die genannte Anforderung nicht umgesetzt werden kann (obwohl sie meiner Meinung
      nach wirklich trivial wäre) halte ich das für einen Fehler im Konzept.
      Da ich annehme, dass dies irgendeine tiefere Bedeutung hat, würde sie mich wirklich
      interessieren.

      Gesucht ist jetzt: Die Frage auf das "Warum?"

      Viele Grüsse

      Philipp

      --
      RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
      Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    2. Hi,

      a) eine DTD, welche <auswahl></auswahl> verbietet, bzw. ein _mindestens_ einmaliges
         Auftreten von name oder PCDATA erlaubt.

      Geht nicht.

      hm, ich kann mir etwas in Richtung

      <!ELEMENT auswahl (#PCDATA|name), (#PCDATA|name)*>

      vorstellen. Liege ich da einfach völlig falsch, oder würde das gehen? Okay, es ist nicht wirklich schön, aber das war ja nicht die Frage ;-)

      Cheatah

      --
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Halihallo Cheatah

        Geht nicht.
        hm, ich kann mir etwas in Richtung
        <!ELEMENT auswahl (#PCDATA|name), (#PCDATA|name)*>

        Die Idee ist richtig und gut, nur scheint der Parser diese Art der Aufzählung nicht zu
        mögen. Dein Beispiel und <!ELEMENT auswahl ((#PCDATA | name),(#PCDATA|name)*)>
        belieben ihm auf jeden Fall nicht. Wie formuliert man das korrekt?

        Viele Grüsse

        Philipp

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
      2. Hallo Cheatah,

        hm, ich kann mir etwas in Richtung

        <!ELEMENT auswahl (#PCDATA|name), (#PCDATA|name)*>

        vorstellen. Liege ich da einfach völlig falsch,

        Ja, du liegst falsch.
        Zweifach:

        1. wenn dann theoretisch!! <!ELEMENT auswahl ((#PCDATA|name), (#PCDATA|name)*)>

        2. Beim gemischten Inhaltsmodell:
           - muss #PCDATA immer an der ersten Stelle angegeben werden
           - es sind keine Aufzählungen [,] zulässig
           - der Operator * muss immer mit dem Inhaltsmodell notiert werden:
          Der grund ist an sich logisch: Ein Text (also PCDATA) kann ja öfters vorkommen: <a>text<b>bla</b><c>bla</c>text text <d>bla</d></a> da kann man eben nicht sagen: (#PCDATA,b,c,#PCDATA,d).
          Das ist eben der Nachteil vom gemischten Inhaltsmodell.

        Grüße
        Thomas

        1. Hi,

          Ja, du liegst falsch.

          schade :-)

          Cheatah

          --
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    In der Vorlesung gab es eine "hitzige" Diskussion zu folgendem Thema:

    --auswahl.dtd--
    <?xml version="1.0" encoding="UTF-8"?>

    Das ist ein einer DTD nicht nur überflüssig, sonder auch falsch, eine DTD ist keine XML-Datei und wird auch nie wellformed oder valide sein.

    * bedeutet (0,n), das Element name wie PCDATA müssen also nicht zwingend vorkommen. Aber:
    Was wenn dies gewollt ist? - Was, wenn name oder PCDATA mindestens einmal vorkommen
    soll? -

    Dann ist die angedachte Struktur falsch, bzw. man könnte es als Nachteil des gemischten Inhaltsmodells auslegen.

    Der Versuch über <!ELEMENT auswahl (#PCDATA|name)+> (für (1,n)) bricht mit einem Fehler ab "File not well-formed; % expected.".

    Siehe meine Antwort an Cheatah.

    Gesucht ist also

    a) eine DTD, welche <auswahl></auswahl> verbietet, bzw. ein _mindestens_ einmaliges Auftreten von name oder PCDATA erlaubt.

    Wie gesagt: gibts nicht.

    b) eine Erklärung, warum (#PCDATA|name)+ Konstruktionen nicht well-formed sind
       (es sei eine "Konvention", wurde uns gesagt. OK, aber das ist keine Erklärung dafür,
        dass es mit '+' nicht auch funktionieren sollte|könnte)

    Das hat u.a. mit Leerraumzeichen (ok, dann eben whitespace) zu tun:
    <a>
       <b>bla</b>
    </a>

    Gehören jetzt deiner Meinung nach die beiden Zeilenumbrüche (&#xA;) in das Element <a> oder nicht? Ist das jetzt #PCDATA oder nur "Lesbarkeitshilfe"? Der Parser kann es auch nicht wissen.
    Und wenn er sich jetzt an deine DTD halten würde, wäre dein XML nicht valide, weil du mit dem ersten Zeilenumbruch bereits ein #PCDATA hattest, wonach Element <b> schon nicht mehr erlaubt ist.

    du kannst höchstens sowas versuchen:

    <!ELEMENT auswahl ((#PCDATA) | (#PCDATA|name)* | (name+))>

    Grüße
    Thomas

    1. Halihallo Thomas

      --auswahl.dtd--
      <?xml version="1.0" encoding="UTF-8"?>
      Das ist ein einer DTD nicht nur überflüssig, sonder auch falsch, eine DTD ist keine XML-Datei und wird auch nie wellformed oder valide sein.

      Nun, ich glaube du folgerst dies aus der XML-Deklaration, natürlich, z.B. ELEMENT-
      Definitions gehören in die DOCTYPE und externe DTD's werden dort sozusagen "eingefügt",
      folglich ist dort <?xml version...?> sowie die Aussagen well-formed, valide fehl am
      Platz. Wer lesen kann, bzw. etwas "um die Ecke denkt", ist klar im Vorteil, du hast
      recht ;-)

      Dann ist die angedachte Struktur falsch, bzw. man könnte es als Nachteil des gemischten Inhaltsmodells auslegen.

      Nun, dann ist es eben so. XML-Schema bietet hierfür evtl. einige Möglichkeiten (AFAIK,
      das werde ich noch nachlesen).

      Gehören jetzt deiner Meinung nach die beiden Zeilenumbrüche (&#xA;) in das Element <a> oder nicht? Ist das jetzt #PCDATA oder nur "Lesbarkeitshilfe"? Der Parser kann es auch nicht wissen.

      Ah, ich habe befürchtet, dass das Beispiel mit #PCDATA nicht gut gewählt war (es war so
      als Beispiel behandelt worden und ich habe es übernommen). Aber genau _das_ war das
      Problem, denn

      <!ELEMENT auswahl (name|vorname)+>
      <!ELEMENT name (#PCDATA)>
      <!ELEMENT vorname (#PCDATA)>

      funktioniert perfekt. Jetzt habe ich auch verstanden, dass #PCDATA der Übeltäter ist.
      Zuerst wollte ich einfach "mindestens ein Element", aber das hat sich jetzt auch gelöst.

      Und wenn er sich jetzt an deine DTD halten würde, wäre dein XML nicht valide, weil du mit dem ersten Zeilenumbruch bereits ein #PCDATA hattest, wonach Element <b> schon nicht mehr erlaubt ist.

      Warum?
      Bei <!ELEMENT auswahl (#PCDATA|name)+>  (wenn es denn ginge), dürfte nachher sehr wohl
      ein Element name folgen, genauso wie noch weitere #PCDATA. Aber die Begründung, dass
      ein "richtiges" #PCDATA nicht von strukturierenden Zeilenumbrüchen und Einzügen zu
      unterscheiden sind, ist eine gute Begründung, warum (#PCDATA|name)+ nicht möglich sein
      sollte. Danke für die Argumentation!

      du kannst höchstens sowas versuchen:
      <!ELEMENT auswahl ((#PCDATA) | (#PCDATA|name)* | (name+))>

      Negativ. Aber warum? - Es erscheint derselbe Fehler. Naja, man muss ja nicht alles bis
      ins letzte Detail definieren können.

      Viele Grüsse und Danke für Deine Antwort

      Philipp

      --
      RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
      Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.