Now that we've emerged from the gory details of XML DTDs, let's see how they work by creating a simple example. You can create a DTD with any text editor and a clear idea of how you want to mark up your XML documents. You'll need an XML parser and processing application to actually interpret and use your DTD, as well as a style sheet to permit XML-capable browsers to display your document.
Let's create a simple XML DTD that defines a markup language for specifying documents containing names and addresses. We start with an address element, which contains other elements that tag the address contents. Our address element has a single attribute indicating whether it is a work or home address:
<!ELEMENT address (name, street+, city, state, zip?)> <!ATTLIST address type (home|business) #REQUIRED>
Voila! The first declaration creates an element named address that contains a name element, one or more street elements, a city and state element, and an optional zip element. The address element has a single attribute, type, that must be specified and can have a value of either home or business.
Let's define the name elements first:
<!ELEMENT name (first, middle?, last)> <!ELEMENT first (#PCDATA)> <!ELEMENT middle (#PCDATA)> <!ELEMENT last (#PCDATA)>
The name element also contains other elements ? a first name, an optional middle name, and a last name ? each of which are defined in the subsequent DTD lines. These three elements have no nested tags and contain only parsed character data; i.e., the actual name of the person.
The remaining address elements are easy, too:
<!ELEMENT street (#PCDATA)> <!ELEMENT city (#PCDATA)> <!ELEMENT state (#PCDATA)> <!ELEMENT zip (#PCDATA)> <!ATTLIST zip length CDATA "5">
All these elements contain parsed character data. The zip element has an attribute named length that indicates the length of the zip code. If the length attribute is not specified, it is set to 5.
Once defined, we can use our address DTD to mark up address documents. For example:
<address type="home"> <name> <first>Chuck</first> <last>Musciano</last> </name> <street>123 Kumquat Way</street> <city>Cary</city> <state>NC</state> <zip length="10">27513-1234</zip> </address>
With an appropriate XML parser and an application to use this data, we can parse and store addresses, create addresses to share with other people and applications, and create display tools that would publish addresses in a wide range of styles and media. Although our DTD is simple, it has defined a standard way to capture address data that is easy to use and understand.