DTD Auszeichnungs(lücke|problem)
Philipp Hasenfratz
- xml
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".
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.
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
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
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
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:
wenn dann theoretisch!! <!ELEMENT auswahl ((#PCDATA|name), (#PCDATA|name)*)>
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
Hi,
Ja, du liegst falsch.
schade :-)
Cheatah
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 (
) 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
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 (
) 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