DTD: Regeln für Kindelementtypen
El Supremo
- xml
0 Rouven0 El Supremo0 El Supremo0 Rouven
Hallo,
ich versuche gerade, mir (vor allem damit) ein wenig über das Erstellen von DTDs bei zu bringen. (Ja, der Themenbereich XML ist wohl nicht ganz korrekt, aber welcher wäre besser?)
Ich habe nun ein Problem mit genaueren Regelungen für Kindelemente.
Stellt euch bitte mal einen Elementtyp mit drei möglichen Kindelementtypen vor, also grob:
<!ELEMENT element (sub1, sub2, sub3)>
Was ich gerne hätte ist Folgendes:
Erstmal soll die Reihenfolge beliebig sein. Laut des oben verlinkten selfHTML Artikels ginge das ja mit dieser Konstruktion:
<!ELEMENT element (sub1, sub2, sub3)*>
Doch da kommt schon das erste Problem (falls ich nicht schon vorher eines übersehen haben sollte …).
Durch das Sternchen wird ja nicht nur die Reihenfolge beliebig, sondern auch die Anzahl der Vorkommen. Kann ich nicht die Reihenfolge beliebig machen, ohne dabei etwas darüber aus zu sage, wie oft das Element vorkommen darf?
Denn ich will im Endeffekt noch etwas Anderes:
sub1 soll immer ein Mal vorkommen müssen, sub2 ein Mal oder mehrmals und sub3 ein Mal oder garnicht. Und dazu eben alle drei Elemente in beliebiger Reihenfolge.
Klar, ein Mal vorkommen ist ja im Prinzip Standard und erfordert keine weiteren Angaben, ein Mal oder mehrmals kann ich mit einem Plus erzeugen und ein Mal oder garnicht mit einem Fragezeichen. Nur, wie ich all das kombinieren kann – dazu auch noch in beliebiger Reihenfolge – ist mir etwas schleierhaft.
Ich denke, am nächsten komme ich meinem Ziel mit
<!ELEMENT element (sub1, sub2+, sub3?)*>
aber ich fürchte, dass das Sternchen mir da einen Strich durch die Rechnug macht … kann mir da jemand bitte weiterhelfen?
Zum anderen noch eine Sache (die so blöd klingt, dass sie mir fast peinlich ist): wo finde ich einen Validator, mit dem ich mein XML Dokument, das die eigene DTD verwendet, mit dieser DTD überprüfen lassen kann? Für XHTML habe ich bisher immer diesen XML Schema Validator verwendet, doch wenn ich ihm mein XML mit externer verlinkter eigener DTD füttere, meint er immer „No supported document type declaration was found, thus a standalone document declaration is assumed.“ (Die DTD ist aber unter dem in der XML Datei angegebenen URI verfügbar.)
Ich würde mich auch hier über einen Rat freuen.
Das wars erstmal, schönen Abend noch,
Gruß,
El Supremo
Hello,
leider ist eine DTD als solche relativ beschränkt was die Kürze der Ausdrucksweise angeht. Deine Anforderungen dürften sich leichter in ein XML Schema fassen lassen, obwohl dies normalerweise weitaus mehr Platz in Anspruch nimmt und schlechter zu lesen ist.
Dein Problem lässt sich mMn am Besten von innen nach außen lösen:
Die Element sub1, sub2, sub3: (sub1, sub2, sub3)
1x, mehrmals, optional: (sub1, sub2+, sub3?)
und das alles in beliebiger Reihenfolge aber genau ein Mal: hier müssen wir ein ODER benutzen und die Permutationen aufzählen. Und sag mir bitte nicht, dass das bei mehr als 4 Elementen keinen Spaß mehr macht...
((sub1, sub2+, sub3?)|(sub1, sub3?, sub2+)|(sub2+,sub1,sub3?)|...)
MfG
Rouven
Hallo,
danke dir für die Antwort.
Deine Anforderungen dürften sich leichter in ein XML Schema fassen lassen, obwohl dies normalerweise weitaus mehr Platz in Anspruch nimmt und schlechter zu lesen ist.
Möglich, dass du da Recht hast – ich kanns nicht beurteilen, da ich auf dem Gebiet bisher kaum Erfahrung habe –, aber ich würde im Moment gerne mit einer DTD auskommen, da mir ein XML Schema deutlich komplexer erscheint und ich fürchte, damit mit Kanonen auf Spatzen zu schießen. Denn eigentlich ist schon fraglich, ob ich überhaupt eine DTD brauche. Es ist schon fast eine Spielerei, allerdings stehe ich eben darauf, meine Dokumente validieren zu lassen …
Dein Problem lässt sich mMn am Besten von innen nach außen lösen:
Die Element sub1, sub2, sub3: (sub1, sub2, sub3)
1x, mehrmals, optional: (sub1, sub2+, sub3?)
und das alles in beliebiger Reihenfolge aber genau ein Mal: hier müssen wir ein ODER benutzen und die Permutationen aufzählen. Und sag mir bitte nicht, dass das bei mehr als 4 Elementen keinen Spaß mehr macht...
((sub1, sub2+, sub3?)|(sub1, sub3?, sub2+)|(sub2+,sub1,sub3?)|...)
Super Idee, dämlich, dass ich da nicht selbst drauf kam. Mir war ehrlich gesagt aber auch nicht klar, dass eine solche Syntax erlaubt ist. Aber gut, eigentlich spricht ja auch nichts dagegen. Und wenn du sagst, dass man es so machen kann, dann will ich da nicht meckern, sondern es einfach so machen …
Hast du (oder jemand anderes) vielleicht noch einen Rat zu meiner zweiten Frage von oben, wo ich mein Dokument nach der DTD validieren lassen kann?
Außerdem noch eine Frage: Wie kann ich denn herausfinden, ob ich innerhalb der DTD korrekte Syntax verwende?
Gruß,
El Supremo
Ohje, ohje, da habe ich mich aber dumm angestellt – sorry. Es gibt ja sogar auf Validome einen XML Validator, der auch eigene DTDs berücksichtigt.
Aber wirklich, ich hatte auch vor der Frage schon gesucht, allerdings wohl nach den falschen Begriffen, so dass ich immer unbrauchbare Ergebnisse bekam. Komme mir grade vor, wie der letzte Suchmaschinen-DAU …
Jedenfalls, das Problem ist jetzt gelöst. Danke nochmals, schönen Abend noch,
Gruß,
El Supremo
Hello,
ich würde da evtl. Altova: XML-Spy empfehlen, wobei ich vor zwei Jahren aufgehört habe zu verfolgen welche Version zu welchem Preis jetzt was kann und was nicht.
MfG
Rouven
ich würde da evtl. Altova: XML-Spy empfehlen, wobei ich vor zwei Jahren aufgehört habe zu verfolgen welche Version zu welchem Preis jetzt was kann und was nicht.
Danke, aber ich bin in der Hinsicht doch eher auf Freeware ausgerichtet … XMLSpy wirkt zwar mächtig, aber ich glaube, so weit, dass ich damit wirklich was anfangen könnte, bin ich sowieso noch lange nicht.
Ich bin mit Notepad++ eigentlich ganz glücklich, auch wenn es natürlich keine vollständige Entwicklungsumgebung ersetzen kann.
Gruß,
El Supremo