两个 DTD 练习的问题

Problems with two DTD exercises

我已经开始了 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: parser error : ATTLIST: no name for Attribute <!ELEMENT Title (#PCDATA)>

第二个给我这个错误:

/home/sandbox/countries.xml:4: element country: validity error : No declaration for element country

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

我不能立即看到第一个错误,但第二个错误是 "country" 和 "Country" 是两个不同的名称。

练习 1: 在 DTD 中这一行的末尾添加一个 >:

<!ATTLIST Courseref Number IDREF #REQUIRED

练习 2: XML 元素名称区分大小写(正如 Michael Kay 已经提到的)。让你的 XML 和 DTD 就 country.

的情况达成一致

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

示例 DTD #1

以下 DTD 更改对于 XML 验证是必要的:

  • Department 的元素声明只允许一个或多个 Professor 元素出现一次,后跟零个或一个 Lecturer 元素。我对此进行了更改以允许出现一次或多次。 (将 Professor+, Lecturer? 包裹在括号中并添加了 + 出现指示符。)
  • Description 有两个元素声明。在XML、Description中有混合内容。混合内容意味着它包含文本和子元素。只有一种方法可以声明混合内容,所以我更新了第一个声明并删除了第二个声明。 (见下面的差异。)
  • 声明了多个属性类型为 IDREF 的属性。如果属性声明为 IDREF 并在 XML 中使用,则该值也必须存在于声明为 ID 的属性中。对于看似 ID 的属性,我将一些 IDREF 类型更改为 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(右)之间的差异:

示例 DTD #2

以下 DTD 更改对于 XML 验证是必要的:

  • DTD中的元素名称首字母大写。 XML 的名称全部小写。将 DTD 中的元素名称更改为小写。
  • country 的元素声明中,模型 (city? | language?)* 表示零个或一个 city 个元素或零个或一个 language 个元素零次或多次。我将其简化为 (city|language)*,这意味着 citylanguage 元素零次或多次。不需要进行此更改。
  • country 元素的 name 属性声明为 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(右)之间的差异: