Creation of Document Type Definitions

Document Type Definition:
Specify Structure and Syntax of XML Document
<!ELEMENT DOCUMENT (CUSTOMER)*>                 
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>          
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>            
<!ELEMENT LAST_NAME (#PCDATA)>                   
<!ELEMENT FIRST_NAME (#PCDATA)>                  
<!ELEMENT DATE (#PCDATA)>                       
<!ELEMENT ORDERS (ITEM)*>                       
<!ELEMENT ITEM (PRODUCT,NUMBER,PRICE)>          
<!ELEMENT PRODUCT (#PCDATA)>                    
<!ELEMENT NUMBER (#PCDATA)>                     
<!ELEMENT PRICE (#PCDATA)>                      

Mini Example of valid XML Document and DTD

<?xml version="1.0"?>
<!DOCTYPE BOOK [                  
    <!ELEMENT BOOK (P*)>
    <!ELEMENT P (#PCDATA)>
]>

<BOOK>
    <P>chapter 1 - Intro</P>
    <P>chapter 2 - Conclusion</P>
    <P>Index</P>
</BOOK>

Creating Document Type Declarations

Element Definition

<!ELEMENT name content_model>

Examples :

Content_model

Multiple Children

Sequences

<!ELEMENT Name (Last_Name, First_Name)
  <Name>
     <Last_Name>Punin</Last_Name>
     <First_Name>John</First_Name>
  </Name>

Choices

<!ELEMENT ITEM (PRODUCT, NUMBER, (PRICE | CHARGEACCT | SAMPLE))>
  <ITEM>
     <PRODUCT>Tomatoes</PRODUCT>
     <NUMBER>8</NUMBER>
     <PRICE>$1.25</PRICE>
  </ITEM>
  <ITEM>
     <PRODUCT>Oranges</PRODUCT>
     <NUMBER>24</NUMBER>
     <SAMPLE>$4.98</SAMPLE>
  </ITEM>

Mixed Content

Example 1:
<!ELEMENT PRODUCT (#PCDATA | PRODUCT_ID)*>                    

<PRODUCT>Tomatoes</PRODUCT>

<PRODUCT>
   <PRODUCT_ID>124829548702121</PRODUCT_ID>
</PRODUCT>
Example 2:
<!ELEMENT p (#PCDATA | b)*>
<!ELEMENT b (#PCDATA)>

<p>This is <b>bold</b> text</p>

Empty Elements & DTD Comments

Empty Elements:
   <!ELEMENT CREDIT_WARNING EMPTY>

   <CREDIT_WARNING></CREDIT_WARNING> or
   <CREDIT_WARNING/>

DTD Comments:

   <!-- DOCUMENT is the root element -->
   <!ELEMENT DOCUMENT (CUSTOMER)*>

A DTD Example

<?xml version="1.0"?>
<!DOCTYPE BOOK [
    <!ELEMENT p (#PCDATA)>
    <!ELEMENT BOOK         (OPENER,SUBTITLE?,INTRODUCTION?,(SECTION | PART)+)>
    <!ELEMENT OPENER       (TITLE_TEXT)*>
    <!ELEMENT TITLE_TEXT   (#PCDATA)>
    <!ELEMENT SUBTITLE     (#PCDATA)>
    <!ELEMENT INTRODUCTION (HEADER, p+)+>
    <!ELEMENT PART         (HEADER, CHAPTER+)>
    <!ELEMENT SECTION      (HEADER, p+)>
    <!ELEMENT HEADER       (#PCDATA)>
    <!ELEMENT CHAPTER      (CHAPTER_NUMBER, CHAPTER_TEXT)>
    <!ELEMENT CHAPTER_NUMBER (#PCDATA)>
    <!ELEMENT CHAPTER_TEXT (p)+>
]>
<BOOK>
    <OPENER>
        <TITLE_TEXT>All About Me</TITLE_TEXT>
    </OPENER>
    <PART>
        <HEADER>Welcome To My Book</HEADER>
        <CHAPTER>
            <CHAPTER_NUMBER>CHAPTER 1</CHAPTER_NUMBER>
            <CHAPTER_TEXT>
                <p>Glad you want to hear about me.</p>
                <p>There's so much to say!</p>
                <p>Where should we start?</p>
                <p>How about more about me?</p>
            </CHAPTER_TEXT>
        </CHAPTER>
    </PART>
</BOOK>

External DTDs (Privates)

External DTDs (Publics)

<!DOCTYPE name PUBLIC "FPI" "URL">

Formal Public Identifier (FPI)

<!DOCTYPE BOOK PUBLIC "-//Joseph Smith//General Book Version 5.3//EN" "http://www.library.org/book.dtd">

XHTML Document

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html 
          PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
         "DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>Virtual Library</title>
</head>
<body>
   <p>Moved to <a href="http://vlib.org/">vlib.org</a>.</p>
</body>
</html>

Attributes

Declaring Attributes in DTDs

<!ATTLIST element_name
    attribute_name  type  default_value
    attribute_name  type  default_value
    .
    .
    .
    attribute_name  type  default_value>
<!ELEMENT greeting (#PCDATA)>
<!ATTLIST greeting 
	  language CDATA "English">

<greeting language="Spanish">
	  Hola!
</greeting>

Types of Attributes

     <!ELEMENT Rectangle EMPTY>
     <!ATTLIST Rectangle
               length CDATA "0px"
               width  CDATA "0px">

     <Rectangle width="80px" length="40px"/>

Default Values for Attributes

     <!ELEMENT img EMPTY>
     <!ATTLIST img
               alt CDATA #REQUIRED
               src CDATA #REQUIRED>
	    
     <img src="xmlj.jpg" alt="XMLJ Image"/>	    

Default Values for Attributes (2)

     <!ELEMENT img EMPTY>
     <!ATTLIST img
                  alt CDATA #REQUIRED
	          src CDATA #REQUIRED
	          width CDATA #IMPLIED
	          height CDATA #IMPLIED>

       <img src="xmlj.jpg" alt="XMLJ Image" width="300"/>

Default Values for Attributes (3)

     <!ELEMENT ADDRESS (#PCDATA)>
     <!ATTLIST ADDRESS
               country CDATA #FIXED "USA">

     <ADDRESS country="USA">123 15th St. Troy NY 12180</ADDRESS>

Types of Attributes (2)

     <!ELEMENT TITLE (#PCDATA)>
     <!ATTLIST TITLE
               ALIGN (LEFT | CENTER | RIGHT) "LEFT">
  
     <TITLE>Programming XML in Java</TITLE>

     <TITLE ALIGN="CENTER">Programming XML in Java</TITLE>

Types of Attributes (3)

     <!ELEMENT student_name (#PCDATA)>
     <!ATTLIST student_name student_no NMTOKEN #REQUIRED>
                          
     <student_name student_no="9216735">Jo Smith</student_name>

Types of Attributes (4)

     <!ELEMENT student_name (#PCDATA)>
     <!ATTLIST student_name student_id ID #REQUIRED>
	    
     <student_name student_id="S9216735">Jo Smith</student_name>

Type of Attributes (5)

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE lab_group [
     <!ELEMENT lab_group (student_name)*>
     <!ELEMENT student_name (#PCDATA)>
     <!ATTLIST student_name student_id ID #REQUIRED
                            tutor IDREF #IMPLIED>
       ]>
<lab_group>
   <student_name student_id="S8904885">Alex Foo</student_name>
   <student_name student_id="S9011133">Sarah Bar</student_name>
   <student_name student_id="S9216735" 
                      tutor="S8904885">Jo Smith</student_name>
</lab_group>

Entities

Internal General Entities

<!ENTITY name definition>

Example 1:
   <!ELEMENT DATE (#PCDATA)>
   <!ENTITY TODAY "February 7, 2001">

   <DATE>&TODAY;</DATE>
Example 2:
   <!ENTITY NAME "John Punin">
   <!ENTITY CNAME "&NAME; Palacios">

External General Entities

<!ENTITY name SYSTEM URI>
<!ENTITY name PUBLIC FPI URI>

Example:
   <!ELEMENT DATE (#PCDATA)>
   <!ENTITY TODAY SYSTEM "date.xml">

   <DATE>&TODAY;</DATE>

Predefined General Entity References

<!ELEMENT EMAIL (#PCDATA)>
<!ENTITY at_new "&#64;">

<EMAIL>puninj&at_new;cs.rpi.edu</EMAIL>

Parameter Entities

Example:

   <!ELEMENT CUSTOMER (NAME, DATE, ORDERS)>
   <!ELEMENT BUYER (NAME, DATE, ORDERS)>
   <!ELEMENT DISCOUNTER (NAME, DATE, ORDERS)>

   <!ENTITY % record "(NAME, DATE, ORDERS)">
   <!ELEMENT CUSTOMER %record;>
   <!ELEMENT BUYER %record;>
   <!ELEMENT DISCOUNTER %record;>