两个 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)*
,这意味着 city
或 language
元素零次或多次。不需要进行此更改。
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(右)之间的差异:
我已经开始了 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)*
,这意味着city
或language
元素零次或多次。不需要进行此更改。 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(右)之间的差异: