Ошибка проверки XML - PullRequest
       22

Ошибка проверки XML

1 голос
/ 29 июня 2011

Я хотел бы знать, какая часть не является правильной? Я исправил один, но другой возвращается.

 <?xml version="1.0"?>
 <!--
 Superstar Movies: Catalog of Movie and Actor Info.
 Author: Randy White
 Date:   6/28/2011

 Filename:         catalog.xml
 -->
 <!DOCTYPE catalog SYSTEM "catalog.dtd">
 <catalog>
<movie movieID="m0100" genre="drama">
    <title>Monster&apos;s Ball</title>
    <date>2001</date>
    <length>111 minutes</length>
    <topBilledActors actorIDs="a0100 a0102"/>
</movie>
<actor actorID="a0100" oscarWinner="yes">
    <name>Halle Berry</name>
    <date>August 14, 1966</date>
    <birthplace>Cleveland, Ohio</birthplace>
    <role character="Leticia Musgrove" movie="m0100"/>
    <role character="Storm" movie="m0101"/>
</actor>
<actor actorID="a0102" oscarWinner="yes">
    <name>Billy Bob Thornton</name>
    <role character="Hank Grotowski" movie="m0100"/>
</actor>
<movie movieID="m0101" genre="fantasy">
    <title>X-Men</title>
    <year>2000</year>
    <length>104 minutes</length>
    <topBilledActors actorIDs="a0100 a0103"/>
</movie>
<actor actorID="a0103" oscarWinner="no">
    <name>Ian McKellen</name>
    <role character="Magneto" movie="m0101"/>
    <role character="Gandolf" movie="m0105"/>
    <role character="Gandolf" movie="m0107"/>
</actor>
<movie movieID="m0105" genre="action" earningsRank="17">
    <title>Lord of the Rings: The Fellowship of the Ring</title>
    <date>2001</date>
    <length>178 minutes</length>
    <topBilledActors actorIDs="a0103"/>
</movie>
<movie movieID="m0107" genre="action" earningsRank="8">
    <title>Lord of the Rings: The Return of the King</title>
    <date>2003</date>
    <length>201 minutes</length>
    <topBilledActors actorIDs="a0103"/>
</movie>
<actor actorID="a0101" oscarWinner="yes">
    <name>Tom Hanks</name>
    <date>July 9, 1956</date>
    <birthplace>Concord, California</birthplace>
    <role character="Captain John H. Miller" movie="m0102"/>
    <role character="Forrest Gump" movie="m0103"/>
    <role character="Andrew Beckett" movie="m0104"/>
</actor>
<movie movieID="m0102" genre="action" earningsRank="50">
    <title>Saving Private Ryan</title>
    <date>1998</date>
    <length>170 minutes</length>
    <topBilledActors actorIDs="a0101 a0104"/>
</movie>
<actor actorID="a0104" oscarWinner="yes">
    <name>Matt Damon</name>
    <date>October 8, 1970</date>
    <birthplace>Cambridge, Massachusetts</birthplace>
    <role character="Private James Francis Ryan" movie="m0102"/>
</actor>
<movie movieID="m0103" genre="comedy" earningsRank="14">
    <title>Forrest Gump</title>
    <date>1994</date>
    <length>142 minutes</length>
    <topBilledActors actorIDs="a0101 a0105 a0106"/>
</movie>
<actor actorID="a0105" oscarWinner="yes">
    <name>Sally Field</name>
    <birthplace>Pasadena, California</birthplace>
    <role character="Mrs. Gump" movie="m0103"/>
</actor>
<actor actorID="a0106">
    <name>Gary Sinise</name>
    <role character="Lt. Dan Taylor" movie="m0103"/>
    <role character="Ken Mattingly" movie="m0106"/>
</actor>
<movie movieID="m0104" genre="drama">
    <title>Philadelphia</title>
    <date>1993</date>
    <length>125 minutes</length>
    <topBilledActors actorIDs="a0101 a0107"/>
</movie>
<movie movieID="m0106" genre="drama">
    <title>Apollo 13</title>
    <date>1995</date>
    <length>140 minutes</length>
    <topBilledActors actorIDs="a0101 a0106"/>
</movie>
<actor actorID="a0107" oscarWinner="yes">
    <name>Denzel Washington</name>
    <role character="Joe Miller" movie="m0104"/>
</actor>

Ошибка, которую я получаю

File C:\Users\Randy\Documents\XML\Solution Files\catalog.xml is not valid.
Content model of element 'movie' disallows element 'length' at this position.
    Error location: catalog / movie / length
    Details
        VC: Element Valid: Content model of element 'movie' disallows element 'length' at this position.

DTD файл

    SuperStar Movies' DTD for XML Catalog documents
    Author: Randy White
    Date:   6/28/2011

    Filename:         catalog.dtd
    -->

    <!ELEMENT catalog (movie|actor)*>

    <!ELEMENT movie (title, date,year,length,topBilledActors)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT year (#PCDATA)>
    <!ELEMENT length (#PCDATA)>
    <!ELEMENT topBilledActors EMPTY>
     <!ATTLIST movie movieID ID #REQUIRED>
    <!ATTLIST movie genre (action|comedy|drama|fantasy) #REQUIRED>
    <!ATTLIST movie earningsRank CDATA #IMPLIED>
    <!ATTLIST topBilledActors actorIDs IDREFS #REQUIRED>

    <!ELEMENT actor (name, date?, birthplace?, role+)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT date (#PCDATA)>
    <!ELEMENT birthplace (#PCDATA)>
     <!ELEMENT role EMPTY>
    <!ATTLIST actor actorID ID #REQUIRED>
    <!ATTLIST actor oscarWinner (yes|no) "no">
    <!ATTLIST role character CDATA #REQUIRED>
    <!ATTLIST role movie IDREF #REQUIRED>

1 Ответ

2 голосов
/ 29 июня 2011

Глядя на DTD, я вижу, что movie должен иметь ровно один title, date, year, length и topBilledActors ( в таком порядке ).

Некоторые из ваших элементов фильма не содержат все необходимые элементы. Либо вам нужно исправить XML, либо ваш DTD нуждается в модификации.

Например, в первом элементе movie отсутствует year:

<movie movieID="m0100" genre="drama">
    <title>Monster&apos;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.

...