我已经开始了一门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:元素国家/地区:有效期错误:否 元素国家的声明
编辑:编辑了人们指出的一些错误,但这两个练习仍然给我错误。
答案 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(右)之间的差异:
示例DTD#2
以下DTD更改是XML验证所必需的:
country
的元素声明中,模型(city? | language?)*
表示零个或一个city
元素或零个或一个language
元素为零次或多次。我将其简化为(city|language)*
,这意味着city
或language
元素为零或更多次。这种变化不是必需的。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(右)之间的差异:
答案 1 :(得分:1)
我无法立即看到第一个错误,但第二个错误是&#34; country&#34;和#34;国家&#34;是两个不同的名字。
答案 2 :(得分:0)
练习1:在DTD中此行的末尾添加>
:
<!ATTLIST Courseref Number IDREF #REQUIRED
练习2: XML元素名称区分大小写(正如Michael Kay已经提到的那样)。使您的XML和DTD同意country
。