Search code examples
xmldtd

Keep getting "No declaration for element" errors. What is wrong with this XML/DTD?


I have created a simple XML and a DTD, but for some reason every single validator I try keep giving me "No declaration for element" errors on every single line. I am not quite sure what I have done wrong as I have only just started looking into XML and DTD, and would appreciate some insight, so I know what I have done wrong and can improve. Any and all help would be greatly appreciated so I know what to do in the future.

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

<!ELEMENT BILLER (RESTAURANTNAME,ADRESS,COMPANYPHONE,CVR)>

<!ELEMENT TIME (DATE,CLOCK)>
<!ELEMENT ORDER (MENUITEM+,CUSTOMER)>

<!ELEMENT RESTAURANTNAME (#PCDATA)>
<!ELEMENT ADRESS (#PCDATA)>
<!ELEMENT COMPANYPHONE (#PCDATA)>
<!ELEMENT CVR (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT CLOCK (#PCDATA)>

<!ELEMENT MENUITEM (FOOD,REQUEST,REQUESTPRICE?,QUANTITY,PRICETOTAL)>
<!ELEMENT CUSTOMER (TABLE,NAME,SPECIALTYPING,PAYMENTMETHOD)>

<!ELEMENT FOOD (#PCDATA)>
<!ELEMENT REQUEST (#PCDATA)>
<!ELEMENT REQUESTPRICE (#PCDATA)>
<!ELEMENT QUANTITY (#PCDATA)>
<!ELEMENT PRICETOTAL (#PCDATA)>

<!ELEMENT TABLE (#PCDATA)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT SPECIALTYPING (#PCDATA)>
<!ELEMENT PAYMENTMETHOD (#PCDATA)>
]>
<regning id="122">    
<tidspunkt>
  <dato>03</dato>
  <måned>01</måned>
  <år>2020</år>
  <tid>13.40</tid>
</tidspunkt>

<restaurant>
<restaurantnavn>Restaurant Fixi</restaurantnavn>
<adresse>Havstreet 128, 478 Andeby</adresse>
<telefon>81 19 26 18</telefon>
<cvr>29 23 28 00</cvr>
</restaurant>

<kundeinfo>
<bord>3</bord>
<kunde-nr>122</kunde-nr>
<specielt>vegetar</specielt>
<betaling>KONTANT</betaling>
</kundeinfo>

<tjener>
        <fornavn>Lotti</fornavn>
        <efternavn>Andersen</efternavn>
</tjener>

<ordre>
  <menugenstand>
    <madtitel>Vegetar Lakseburger med fritter</madtitel>
    <ekstra>x</ekstra>
    <quantity>1</quantity>
    <pris valuta="DKK">80</pris>
  </menugenstand>

<menugenstand>
    <drikketitel>Økologisk hvedeøl</drikketitel>
    <ekstra>x</ekstra>
    <quantity>1</quantity>
    <pris valuta="DKK">45</pris>
  </menugenstand>

  <menugenstand>
    <madtitel>Båd Banannasplit</madtitel>
    <ekstra>Ekstra flødeskum</ekstra>
    <requestprice>10</requestprice>
    <quantity>1</quantity>
  <pris valuta="DKK">55</pris>
  </menugenstand>

</ordre>
</regning>

Solution

  • An XML document must be well formed (syntax ok, one root element, all elements closed, etc) but in addition it can also be valid against a DTD or an XML Schema. In the case of a DTD (Document Type Definition), the DTD governs the content model, i.e. what is the root element, what other elements can a specific element contain, what attributes can there be, etc, etc. I would encourage you to actually read the XML specification. It's not that difficult.

    So, in your example, the <regning> element is not defined in the DTD, and since XML element names (tags) are case sensitive, no element in your XML document matches any ELEMENT declaration in the DTD. To match your XML document, the DTD must start with something like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE regning [
    <!ELEMENT regning (tidspunkt, restaurant, kundeinfo, tjener, ordre) >
    <!ATTLIST regning id ID #REQUIRED >
     ... rest of the content model ...
    ]>
    <regning id="122">'
        ...
    </regning>