André: DTD - Reihenfolge und Häufigkeit von Elementen festlegen

Hallo ihr!

Ich habe da ein Problem.
Ich möchte eine DTD verfassen, die folgende Eigenschaften für die beschriebenen Elemente festlegt:

1. Die Reihenfolge der Element íst völlig egal
2. Keines der Elemente muß auftauchen, aber manche dürfen maximal einmal und manche beliebig oft auftreten.

Könnte mir bitte jemand erklären, wie sich diese Anforderungen synaktisch umsetzen lassen?

Mein bisher bester DTD Versuch sieht vereinfacht so aus:

<?xml version="1.0"?>
<!DOCTYPE abc [
<!ELEMENT abc (a|b|c)*>
 <!ELEMENT a (#PCDATA)>
 <!ELEMENT b (#PCDATA)>
 <!ELEMENT c (#PCDATA)>
]>

Eine Beispiel XML Datei:

<abc>
 <a>aaa</a>
 <c>ccc</c>
 <b>bbb</b>
 <c>ccc</c>
</abc>

Das Problem an dieser Variante ist aber, dass zwar die erste Anforderung erfüllt ist, aber die Auftrittshäufigkeit für KEINES der Elemente auf "einmal" beschränkt ist.

Vielleicht könnt ihr eure Vorschläge auch gleich an dem Beispiel festmachen. Wäre super. Danke schon mal an jeden, der mir in diesem Fall helfen kann.

Gruß, André.

Anmerkung: Ein Großteil der mit dieser DTD zu validierenden XML Dateien existiert schon, eine völlig anders strukturuíerte DTD scheidet also aus.

  1. Hallo André,

    Könnte mir bitte jemand erklären, wie sich diese
    Anforderungen synaktisch umsetzen lassen?

    Mein bisher bester DTD Versuch sieht vereinfacht so aus:

    <?xml version="1.0"?>
    <!DOCTYPE abc [
    <!ELEMENT abc (a|b|c)*>
    <!ELEMENT a (#PCDATA)>
    <!ELEMENT b (#PCDATA)>
    <!ELEMENT c (#PCDATA)>
    ]>

    <!ELEMENT abc (a?|(b|c)*)>
    <!ELEMENT a (#PCDATA)>
    <!ELEMENT b (#PCDATA)>
    <!ELEMENT c (#PCDATA)>

    So muesste es gehen. Hier duerfte a maximal einmal vorkommen,
    b und c jedoch duerften beliebig oft vorkommen.

    Eine Beispiel XML Datei:

    <abc>
     <b>blub</b>
     <c>blahr</c>
     <a>blahr</a>
     <b>blub</b>
     <c>blahr</c>
    </abc>

    Gruesse,
     CK

    1. Hallo nochmal.

      <?xml version="1.0"?>
       <!DOCTYPE abc [
       <!ELEMENT abc (a?|(b|c)*)>
       <!ELEMENT a (#PCDATA)>
       <!ELEMENT b (#PCDATA)>
       <!ELEMENT c (#PCDATA)>
      ]>

      <abc>
       <b>blub</b>
       <c>blahr</c>
       <a>blahr</a>
       <b>blub</b>
       <c>blahr</c>
      </abc>

      Tja, danke erstmal für die schnelle Antwort. Aber ich habe mal deinen Vorschlag probeweise zum Test durch den Validator auf der Seite ...

      http://www.w3schools.com/dom/dom_validate.asp

      ... geschickt und der bringt mir weiterhin Fehlermeldungen, dass die XML Daten im Sinne der DTD ungültig sind.

      Bin weiterhin für ideen dankbar.

      André

      1. Hallo,

        Bin weiterhin für ideen dankbar.

        statt

        <!ELEMENT abc (a?|(b|c)*)>

        <!ELEMENT abc (a?|(b|c)*)*>

        und die Validierung ist erfolgreich, zumindest für das Beispieldokument.

        Gruß
        Franz

        1. Hallo fjh,

          Bin weiterhin für ideen dankbar.

          statt

          <!ELEMENT abc (a?|(b|c)*)>

          <!ELEMENT abc (a?|(b|c)*)*>

          und die Validierung ist erfolgreich, zumindest für das
          Beispieldokument.

          Aber nicht im Sinne dessen, was gefordert ist. Mit der DTD
          waere auch ein Dokument mit n 'a'-Elementen valide. Ehrlich
          gesagt faellt mir im Moment kein Weg ein, das auszudruecken,
          was gewuenscht ist: beliebige Reihenfolge, bestimmte Elemente
          duerfen nur 1x vorkommen, bestimmte Elemente n mal.

          Gruesse,
           CK

          1. Hallo Christian,

            Ehrlich gesagt faellt mir im Moment kein Weg ein, das auszudruecken,
            was gewuenscht ist: beliebige Reihenfolge, bestimmte Elemente
            duerfen nur 1x vorkommen, bestimmte Elemente n mal.

            Hm, beim genaueren Hinsehen und nochmal hinsehen und nochmal....
            fällt mir auch nix ein.

            Zum Glück bin ich kein echter Informatiker, sonst würde ich jetzt den ganzen Arbeitstag versuchen nachzuweisen, dass es nicht geht mit DTDs bzw. falls es doch geht, die Anzahl der möglichen Inhaltsmodelle, die ich dann mit oder-Verknüpfungen aufzählen müsste, um alle möglichen Fälle abzudecken ;-)

            Gruß
            Franz

            1. Zusammenfassung:

              Ich glaube ich geb'auf.
              Um alle Fälle mit "|" abzudecken wäre wahrscheinlich ganz schön viel Platzbedarf angesagt. Bei n beteiligten Elementen hieße das: 1 * 2 * 3 * .. * n. Kurz: n! !!!
              Da das mir persönlich zu viel Arbeit ist, muß ich wohl was anderes einfallen lassen. Wie wär's ich hätte da ca 125 XML Files zum vorsortieren anzubieten. ;-)
              Bleibt nur die Genugtuung, wieder mal bewiesen zu haben, dass DTD's ziemlich blöd sind. Werde mir wohl demnächst nochmal XML-Schemas zu Gemüte führen müssen.

              Danke an alle, die sich den Kopf zerbrochen haben.

              André

              1. Hallo.

                Bleibt nur die Genugtuung, wieder mal bewiesen zu haben, dass DTD's ziemlich blöd sind.

                Das stimmt nicht.

                Werde mir wohl demnächst nochmal XML-Schemas zu Gemüte führen müssen.

                Hat gewisse vorteile, das ist richtig.

                Grüße
                Thomas

    2. Hallo,

      <!ELEMENT abc (a?|(b|c)*)>
      <!ELEMENT a (#PCDATA)>
      <!ELEMENT b (#PCDATA)>
      <!ELEMENT c (#PCDATA)>

      So muesste es gehen. Hier duerfte a maximal einmal vorkommen,
      b und c jedoch duerften beliebig oft vorkommen.

      Leider wird das nicht gehen, wie schon André feststellte:
      <!ELEMENT abc (a?|(b|c)*)> sagt folgendes:
      entweder a (das ein oder kein Mal vorkommmen kann)
      oder
      b oder c (beliebig oft)

      Ohne ein * nach dem Inhaltmodell (also nach dem letzten ')' wird es schwer mit einer XML-DTD gehen, wobei das * dann die Sache ad absurdum führt.
      In einer SGML-DTD ginge das so: <!ELEMENT abc (a? & b* & c*)>
      z.b. "a & b" kann im XML mit "(a,b) | (b,a)" abgebildet werden. Tja ... und wer Lust hat kann ja damit spielen.

      Grüße
      Thomas