Your support for our advertisers helps cover the cost of hosting, research, and maintenance of this FAQ

The XML FAQ — Frequently-Asked Questions about the Extensible Markup Language

Section 3: Authors

Q 3.12: How do I create my own document type?

Analyse the class of documents, and write a DTD or Schema

Document types usually need a formal description, either a DTD or a Schema. Whilst it is possible to process well-formed XML documents without any such description, trying to create them without one is asking for trouble. A DTD or Schema is used with an XML editor or API interface to guide and control the construction of the document, making sure the right elements go in the right places (see question C.14 on ‘I keep hearing about alternatives to DTDs. What's a Schema?’ for more on this).

Creating your own document type therefore begins with an analysis of the class of documents you want to encode: reports, invoices, letters, configuration files, credit-card verification requests, novels, plays, theses, or whatever. Once you have the structure correct, you write code to express this formally, using DTD or Schema syntax.

If you want to create a DTD, you need to learn the XML Declaration Syntax (very simple: declaration keywords begin with <! rather than just the open angle bracket, and the way the declarations are formed also differs slightly). Here's an example of a DTD for a shopping list, based on the fragment used earlier:

<!ELEMENT Shopping-List (Item)+>
<!ELEMENT Item (#PCDATA)>
	  

It says that there shall be an element called Shopping-List and that it shall contain elements called Item: there must be at least one Item (that's the plus sign) but there may be more than one. It also says that the Item element may contain only parsed character data (PCDATA, ie text: no further markup).

Because there is no other element which contains Shopping-List, that element is assumed to be the ‘root’ element, which encloses everything else in the document. You can now use it to create an XML file: give your editor the declarations:

 
<?xml version="1.0"?> 
<!DOCTYPE Shopping-List SYSTEM "shoplist.dtd"> 
	  

(assuming you put the DTD in that file). Now your editor will let you create files according to the pattern:

<Shopping-List>
  <Item>Chocolate</Item>
  <Item>Sugar</Item>
  <Item>Butter</Item>
</Shopping-List>
	  

It is possible to develop complex and powerful DTDs of great subtlety, but for any significant use you should learn more about document systems analysis and document type design. See for example Maler and el Andaloussi (1995): this was written for SGML but perhaps 95% of it applies to XML as well, as XML is much simpler than full SGML — see the list of restrictions which shows what has been cut out.

Incidentally, a DTD file never has a DOCTYPE Declaration in it: that only occurs in an XML document instance (it's what references the DTD). And a DTD file also never has an XML Declaration at the top either. Unfortunately there is still software around which inserts one or both of these.