# XML mit DTD abgleichen - "Content must match"



## PinkMuffin (4. Jan 2021)

Guten Morgen,

mein Java-Programm erstellt eine XML-Datei, die mit einer DTD-Datei abgeglichen werden soll. 
Ich hab es mal extern in einen Validator kopiert, um zu schauen ob es gehen würde, wenn es die DTD auch aufruft. 
Allerdings gibt es da ein paar Fehlermeldungen, die meisten konnte ich beheben, aber eine verstehe ich nicht:
In Zeile 19 der XML (also nach </Kassenzettel> ganz am Ende) heißt es 
*"The content of element type "Kassenzettel" must match "(Geschaeftsinformationen,Filiale,Anschrift,Strasse,Ort,Artikel,Bezeichnung,Nettopreis,Bruttopreis,Gesamtpreis,Kaufdatum)"".*

Allerdings ist der Inhalt auch in der gleichen Reihenfolge im Kassenzettel enthalten, weiß jemand, was damit gemeint ist?



```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Kassenzettel SYSTEM "src/Format.dtd">
<Kassenzettel>
<Geschaeftsinformationen>
<Filiale> Ekeda Schröter </Filiale>
<Anschrift><Strasse> Steiner Straße 56</Strasse><Ort>Königsbach-Stein</Ort></Anschrift>
</Geschaeftsinformationen>
<Artikel Artikel-Id ="id_1" ><Bezeichnung>Mandelmus</Bezeichnung>
<Nettopreis>8.5 €</Nettopreis>
<Bruttopreis>8.92 €</Bruttopreis>
</Artikel>
<Artikel Artikel-Id ="id_2" ><Bezeichnung>Shampoo</Bezeichnung>
<Nettopreis>2.5 €</Nettopreis>
<Bruttopreis>2.9 €</Bruttopreis>
</Artikel>
<Gesamtpreis> zu zahlen: 11.82 € </Gesamtpreis>
<Kaufdatum></Kaufdatum>
</Kassenzettel>
```


```
<!ELEMENT Kassenzettel (Geschaeftsinformationen, Filiale, Anschrift, Strasse, Ort, Artikel, Bezeichnung, Nettopreis, Bruttopreis,
                           Gesamtpreis, Kaufdatum)>
  <!ELEMENT Geschaeftsinformationen (Filiale, Anschrift)>
  <!ELEMENT Anschrift (Strasse, Ort)>
  <!ELEMENT Artikel (Bezeichnung, Nettopreis, Bruttopreis)>
  <!ATTLIST Artikel 
      Artikel-Id     ID    #REQUIRED>
  <!ELEMENT Filile (#PCDATA)>
  <!ELEMENT Strasse (#PCDATA)>
  <!ELEMENT Ort (#PCDATA)>
  <!ELEMENT Bezeichnung (#PCDATA)>
  <!ELEMENT Nettopreis (#PCDATA)>
  <!ELEMENT Bruttopreis (#PCDATA)>
  <!ELEMENT Gesamtpreis (#PCDATA)>
  <!ELEMENT Kaufdatum (#PCDATA)>
```


----------



## LimDul (4. Jan 2021)

Das ist nicht enthalten. Kassenzettel enthält im XML die ELemente: Geschaeftsinformationen, Artikel  (mehrfach), Gesamtpreis und Kaufdatum. Mehr nicht. Die anderen Elemente sind Sub-Elemente dieser Elemente, aber kein direktes Sub-Element des Kassenzettel


----------



## httpdigest (4. Jan 2021)

Die DTD besagt, dass nach Geschaeftsinformationen (die ja Filiale und Anschrift als Children enthält) noch Filiale und Anschrift kommen soll. Desweiteren soll auch nach Anschrift (die ja Strasse und Ort als Children enthält) auch nochmal Strasse und Ort als Siblingelemente kommen und so weiter.
Ich denke, die DTD ist einfach falsch, bzw. die Deklaration von Kassenzettel ist falsch, weil es die Elemente, die ja woanders als Children enthalten sind, immer nochmal aufführt.
Die Deklaration von Kassenzettel sollte wohl eher sein:

```
<!ELEMENT Kassenzettel (Geschaeftsinformationen,  Artikel, Gesamtpreis, Kaufdatum)>
```


----------



## PinkMuffin (4. Jan 2021)

LimDul hat gesagt.:


> Das ist nicht enthalten. Kassenzettel enthält im XML die ELemente: Geschaeftsinformationen, Artikel  (mehrfach), Gesamtpreis und Kaufdatum. Mehr nicht. Die anderen Elemente sind Sub-Elemente dieser Elemente, aber kein direktes Sub-Element des Kassenzettel


Achso, ich hatte es so verstanden, dass die Sub-Elemente im root-Element trotzdem angegeben werden müssen, macht aber sowieso wesentlich mehr Sinn, wenn es nicht so gehört ^^


----------

