DOCTYPE Declaration

The DOCTYPE declaration provides a space for a document to identify its root element and document type definition (DTD) by reference to an external file, through direct declarations, or both.

A DOCTYPE declaration can contain:

  • The name of the document or root element.

    This is required if the DOCTYPE declaration is used.

  • System and public identifiers for the DTD that can be used to validate the document structure.

    If a public identifier is used, a system identifier must also be present.

  • An internal subset of DTD declarations.

    The internal subset appears between square brackets ([ ]).

A DOCTYPE declaration is mandatory if the document is to be processed in a validating environment. To be valid, the DOCTYPE declaration must identify a DTD that corresponds to the document structure of the document. Nonvalidating parsers will accept documents without DOCTYPE declarations.

The simplest DOCTYPE declaration identifies only the root element of the document.

<!DOCTYPE rootElement>

More often, documents that use the DOCTYPE declaration reference an external document containing the declarations that make up the DTD. The following can be used to identify the external DTD.

<!DOCTYPE rootElement SYSTEM "URIreference">

The URIreference points to a file containing the declarations.

<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference">

The PublicIdentifier provides a separate identifier that some XML parsers can use to reference the DTD in place of the URIreference. This is useful if the parser is used on a system without a network connection or where that connection would slow down processing significantly.

DOCTYPE declarations can also include declarations directly, in what is referred to as the internal subset. If a DOCTYPE declaration includes the entire DTD directly, without reference to external files, it uses the following syntax.

<!DOCTYPE rootElement [

If the DOCTYPE declaration includes declarations that are to be combined with external files or the external subset, it uses the following syntax.

<!DOCTYPE rootElement SYSTEM "URIreference"[


<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference"[