两个DTD练习的问题

时间:2016-08-28 09:29:22

标签: sql xml dtd

我已经开始了一门SQL课程,现在我正在使用XML,但是不能通过这两个不断给我错误的练习。

练习1 XML:https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/courses-ID.xml

我的代码:

<!ELEMENT Course_Catalog (Department*)>

<!ELEMENT Department (Title, Course+, Professor+, Lecturer?)>
<!ELEMENT Course (Title, Description?)>
<!ELEMENT Description (Courseref)>
<!ELEMENT Professor (First_Name, Middle_Initial?, Last_Name)>
<!ELEMENT Lecturer (First_Name, Middle_Initial?, Last_Name)>

<!ATTLIST Department Code IDREFS #REQUIRED
                     Chair IDREFS #REQUIRED>
<!ATTLIST Course Number ID #REQUIRED
                 Prerequisites IDREFS #IMPLIED
                 Instructors IDREFS #REQUIRED
                 Enrollment CDATA #IMPLIED>
<!ATTLIST Professor InstrID IDREF #REQUIRED>
<!ATTLIST Lecturer InstrID IDREF #REQUIRED>
<!ATTLIST Courseref Number IDREF #REQUIRED>

<!ELEMENT Title (#PCDATA)>
<!ELEMENT Description (#PCDATA)>
<!ELEMENT First_Name (#PCDATA)>
<!ELEMENT Middle_Initial (#PCDATA)>
<!ELEMENT Last_Name (#PCDATA)>
<!ELEMENT Courseref (#PCDATA)>

练习2 XML:https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/countries.xml

我的代码:

<!ELEMENT countries (Country*)>

<!ELEMENT Country (City? | Language?)*>
<!ELEMENT City (Name, Population)>

<!ATTLIST Country Name ID #REQUIRED
                  Population CDATA #REQUIRED
                  Area CDATA #REQUIRED>
<!ATTLIST Language Percentage CDATA #REQUIRED>

<!ELEMENT Language (#PCDATA)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Population (#PCDATA)>

第一个给我这个错误:

  

/tmp/tmpfFfDHT.dtd:19:解析器错误:ATTLIST:没有属​​性的名称   <!ELEMENT Title (#PCDATA)>

第二个给了我这个错误:

  

/home/sandbox/countries.xml:4:元素国家/地区:有效期错误:否   元素国家的声明

编辑:编辑了人们指出的一些错误,但这两个练习仍然给我错误。

3 个答案:

答案 0 :(得分:2)

对于这两个例子,我假设只允许DTD更改,而不是更改XML。

示例DTD#1

以下DTD更改是XML验证所必需的:

  • Department的元素声明仅允许出现一个或多个Professor元素,后跟零或一个Lecturer元素。我改变了这个以允许一次或多次出现这种情况。 (在{parens中包含Professor+, Lecturer?并添加了+出现指示符。)
  • Description有两个元素声明。在XML中,Description混合了内容。混合内容意味着它包含text和child元素。声明混合内容只有一种方法,所以我更新了第一个声明并删除了第二个声明。 (见下面的差异。)
  • 使用属性类型IDREF声明了多个属性。如果属性声明为IDREF并在XML中使用,则该值也必须存在于声明为ID的属性中。我将一些IDREF类型更改为ID,用于看似ID的属性。 (见下面的差异。)

这是新的DTD:

<!ELEMENT Course_Catalog (Department*)>

<!ELEMENT Department (Title, Course+, (Professor+, Lecturer?)+)>
<!ELEMENT Course (Title, Description?)>
<!ELEMENT Description (#PCDATA|Courseref)*>
<!ELEMENT Professor (First_Name, Middle_Initial?, Last_Name)>
<!ELEMENT Lecturer (First_Name, Middle_Initial?, Last_Name)>

<!ATTLIST Department Code ID #REQUIRED
                     Chair IDREFS #REQUIRED>
<!ATTLIST Course Number ID #REQUIRED
                 Prerequisites IDREFS #IMPLIED
                 Instructors IDREFS #REQUIRED
                 Enrollment CDATA #IMPLIED>
<!ATTLIST Professor InstrID ID #REQUIRED>
<!ATTLIST Lecturer InstrID ID #REQUIRED>
<!ATTLIST Courseref Number IDREF #REQUIRED>

<!ELEMENT Title (#PCDATA)>
<!ELEMENT First_Name (#PCDATA)>
<!ELEMENT Middle_Initial (#PCDATA)>
<!ELEMENT Last_Name (#PCDATA)>
<!ELEMENT Courseref (#PCDATA)>

这是您的DTD(左)和修改后的DTD(右)之间的差异:

exercise 1 diff report

示例DTD#2

以下DTD更改是XML验证所必需的:

  • DTD中的元素名称都有首字母大写。 XML具有所有小写名称。将DTD中的元素名称更改为小写。
  • country的元素声明中,模型(city? | language?)*表示零个或一个city元素或零个或一个language元素为零次或多次。我将其简化为(city|language)*,这意味着citylanguage元素为零或更多次。这种变化不是必需的。
  • name元素的country属性是使用类型ID声明的。实际的XML似乎没有ID。例如,Antigua and Barbuda不是有效的ID。我将此属性更改为CDATA类型。

这是新的DTD:

<!ELEMENT countries (country*)>

<!ELEMENT country (city|language)*>
<!ELEMENT city (name, population)>

<!ATTLIST country name CDATA #REQUIRED
        population CDATA #REQUIRED
        area CDATA #REQUIRED>
<!ATTLIST language percentage CDATA #REQUIRED>

<!ELEMENT language (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT population (#PCDATA)>

这是您的DTD(左)和修改后的DTD(右)之间的差异:

exercise 2 diff report

答案 1 :(得分:1)

我无法立即看到第一个错误,但第二个错误是&#34; country&#34;和#34;国家&#34;是两个不同的名字。

答案 2 :(得分:0)

练习1:在DTD中此行的末尾添加>

<!ATTLIST Courseref Number IDREF #REQUIRED

练习2: XML元素名称区分大小写(正如Michael Kay已经提到的那样)。使您的XML和DTD同意country

的情况