Глядя на DTD, я вижу, что movie
должен иметь ровно один title
, date
, year
, length
и topBilledActors
( в таком порядке ).
Некоторые из ваших элементов фильма не содержат все необходимые элементы. Либо вам нужно исправить XML, либо ваш DTD нуждается в модификации.
Например, в первом элементе movie
отсутствует year
:
<movie movieID="m0100" genre="drama">
<title>Monster's Ball</title>
<date>2001</date>
<length>111 minutes</length>
<topBilledActors actorIDs="a0100 a0102"/>
</movie>
Я бы склонялся к модификации DTD, поскольку у вас есть несколько объявлений ATTLIST для фильма.
Вот как я бы изменил ваш DTD:
<!ELEMENT catalog (movie|actor)*>
<!ELEMENT movie (title?,date?,year?,length?,topBilledActors?)>
<!ATTLIST movie
movieID ID #REQUIRED
genre (action|comedy|drama|fantasy) #REQUIRED
earningsRank CDATA #IMPLIED>
<!ELEMENT topBilledActors EMPTY>
<!ATTLIST topBilledActors
actorIDs IDREFS #REQUIRED>
<!ELEMENT actor (name, date?, birthplace?, role+)>
<!ATTLIST actor
actorID ID #REQUIRED
oscarWinner (yes|no) "no">
<!ELEMENT role EMPTY>
<!ATTLIST role
character CDATA #REQUIRED
movie IDREF #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT length (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT birthplace (#PCDATA)>
Обратите внимание, что дочерние элементы movie
теперь являются необязательными (? = Ноль или одно вхождение).
Также обратите внимание, как я объединил объявления ATTLIST и поместил их вместе с объявлениями их элементов. Перемещение их под декларацией элемента значительно облегчает чтение DTD.