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.
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">
URIreference points to a file containing the declarations.
<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference">
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 [ declarations ]>
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"[ declarations ]>
<!DOCTYPE rootElement PUBLIC "PublicIdentifier" "URIreference"[ declarations ]>