为给定代码生成DTD

时间:2017-08-07 10:37:31

标签: xml dtd xml-dtd

给定的代码是:

<?xml version="1.0" encoding="UTF-8"?>
<student id="12C042">

  <fName>John</fName>

  <lName>Nelson</lName>

  <plan>
    <courses year="3">
        <course>
            <name> Extensible Markup Language</name>
            <shortName>XML</shortName>
            <record>
                <grade>30</grade>
                <date>12-Jan-2017</date>
            </record>
        </course>

        <course>
            <name>Object Oriented Concepts and Unified Modeling Language</name>
            <shortName><![CDATA[OOP & UML]]></shortName>
        </course>
    </courses>
  </plan>
</student>

我需要为此生成一个DTD xml文件。

我做了一个代码:

<!ELEMENT student (fName,lName,plan)>
<!ELEMENT fName (#PCDATA)>
<!ELEMENT lName (#PCDATA)>
<!ELEMENT plan (courses)>
<!ELEMENT courses (course?)>
<!ELEMENT course (name,shortName*,record*)>
<!ELEMENT name ANY>
<!ELEMENT shortName ANY>
<!ELEMENT record (grade,date)>
<!ELEMENT grade ANY>
<!ELEMENT date ANY>
<!ATTLIST student id NMTOKEN #REQUIRED>
<!ATTLIST courses year CDATA #IMPLIED>

它给我一个错误:

Error:                                                                          
   Public ID: null                                                              
   System ID: file:/home/p/student.xml                                     
   Line number: 20                                                              
   Column number: 13                                                            
   Message: The content of element type "courses" must match "(course)".        
error  

3 个答案:

答案 0 :(得分:0)

您目前对courses的声明表示允许course为零或一次(这就是?的含义)。

您的XML有两个course元素。

您需要将声明更改为允许course零次或多次(*)或一次或多次(+)。

示例...

<!ELEMENT courses (course)*>

答案 1 :(得分:0)

元素类型courses的内容必须与(course)匹配,错误是由于代码不匹配所致。
?允许记录在xml中出现零次或一次出现,因为它没有出现在第二个课程标签中。
因此,要解决此错误,请将课程dtd设置为<!ELEMENT course (name,shortName,record?)>

<!ELEMENT student (fName,lName,plan)>
<!ELEMENT fName (#PCDATA)>
<!ELEMENT lName (#PCDATA)>
<!ELEMENT plan (courses)>
<!ELEMENT courses (course)>
<!ELEMENT course (name,shortName,record?)>
<!ELEMENT name ANY>
<!ELEMENT shortName ANY>
<!ELEMENT record (grade,date)>
<!ELEMENT grade ANY>
<!ELEMENT date ANY>
<!ATTLIST student id NMTOKEN #REQUIRED>
<!ATTLIST courses year CDATA #REQUIRED>

答案 2 :(得分:0)

尝试一下,它将起作用

    <!ELEMENT student (fName,lName,plan*)>
    <!ELEMENT fName (#PCDATA)>
    <!ELEMENT lName (#PCDATA)>
    <!ELEMENT plan (courses*)>
    <!ELEMENT courses (course+)>
    <!ELEMENT course (name,shortName,record?)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT shortName (#PCDATA)>
    <!ELEMENT record (grade,date)>
    <!ELEMENT grade (#PCDATA)>
    <!ELEMENT date (#PCDATA)>
    <!ATTLIST student id NMTOKEN #REQUIRED>
    <!ATTLIST courses year CDATA #REQUIRED>