开发者

XML Validation error

I would like to know which part is not correct? I fixed one but another comes back.

 <?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>

Error that I am getting

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 File

    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>


Looking at the DTD, I can see that movie has to have exactly one title, date, year, length, and topBilledActors (in that order).

Some of your movie elements don't contain all of the necessary elements. Either you need to fix the XML, or your DTD needs modifications.

For example, the first movie element is missing a year:

<movie movieID="m0100" genre="drama">
    <title>Monster&apos;s Ball</title>
    <date>2001</date>
    <length>111 minutes</length>
    <topBilledActors actorIDs="a0100 a0102"/>
</movie>

I would lean toward DTD modifications since you have multiple ATTLIST declarations for movie.

This is how I would modify your 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)>

Notice that the children of movie are now optional (? = zero or one occurrence).

Also notice how I merged the ATTLIST declarations and put them with their element declarations. Moving them just under the element declaration makes the DTD much easier to read.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜