文書型宣言（ぶんしょかたせんげん）、DOCTYPE宣言（DOCTYPEせんげん）は、SGMLやXML文書を、文書型定義（DTD）と結びつけるための宣言である。

概要 
文書型宣言はSGMLやXML文書の冒頭に記載される。SGMLやXML文書において、どのような要素をどのように配置することが許されるかはスキーマ言語によって定義されている。歴史的経緯から、スキーマ言語としてはDTDが主に用いられてきた。文書を解析するパーサは文書型宣言に指定されたDTDを参照することで、規則に従った妥当な文書か否かを検証することができる。

HTML2.0からHTML4.01までのHTMLはSGML文書の一種として定義されているため、文書型宣言はHTML文書の冒頭にも記載される。これによって、たとえばウェブページの制作者は、W3C Markup Validation ServiceやAnother HTML-lintなどのサービスを用いて、見落としていたページ内のエラーを発見できる。

一部のHTMLレンダリングエンジンは「DOCTYPEスイッチ」と呼ばれる機能を有している。これはMIMEタイプとしてtext/htmlを与えられた文書に書かれた文書型宣言の内容によってレンダリングを「標準モード」や「互換モード（Quirksモード）」というように切り替えるものである。

HTML5はSGMLベースではなくなったが、MIMEタイプは依然としてtext/htmlを使用しているため、DOCTYPEスイッチの影響を受ける。そこでHTML5でもこのモード切替のためだけに文書型宣言を残している。すなわちHTML5における文書型宣言は、レンダリングを「標準モード」へ切り替えるためだけの、「ほとんど役に立たないが、それでも必要な」ヘッダである。

文法 
文書型宣言の一般的な文法は以下のようになる。

<!DOCTYPE ルート要素 PUBLIC "公開識別子" ["URI"] [ 
<!-- サブセットの宣言 -->
]>

or

<!DOCTYPE ルート要素 SYSTEM "URI" [ 
<!-- サブセットの宣言 -->
]>

ルート要素とは文書全体の最上位となる要素である。XMLでは、ドキュメントのルート要素はいちばん初めに現れた要素である。例えば、XHTMLでは、ルート要素はDOCTYPE宣言の直後に開始し、文書の終わりで閉じられるhtml要素である。

SYSTEMやPUBLICというキーワードは、DTDがシステム内部のものなのか、公開されているものなのかを指定するためのキーワードである。

PUBLICを指定した場合、その後には限られた公開識別子（公式公開識別子; FPI）を二重引用符で括って指定する必要があり、その後には必要であれば、同じく二重引用符で括った「システム識別子」を指定することができる。たとえば、XHTML 1.1の公開識別子は"-//W3C//DTD XHTML 1.1//EN"であり、その後にはシステム識別子である"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"を続けることができる。

一方、SYSTEMを指定した場合、その後にはシステム識別子を続ける必要がある。これらのシステム識別子としては、URIの形式でDTDの所在を指定する。

最後に、角括弧（[]）で囲んで、宣言への追加・変更などを行える「内部サブセット」を続けることができる。なお、内部サブセットは省略可能であり、完全なSGML実装になっていないパーサー（とりわけ、HTML専用のもの）では解析不能となるため付けてはならないこともある。

公開識別子とシステム識別子は独立の概念であるが、HTMLのようにSGMLを元にしたドキュメントでは、公開識別子とシステム識別子が関連付けられる場合がある。この場合、公開識別子を記述すればシステム識別子が省略可能であり、この関連付けは、例えばその関係性を記録したテーブルによって行われる。XMLではシステム識別子を省略できない。

具体例 
例えば HTML 4.01 Transitional で書かれたWebページでは、1行目は以下のようになる。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

この文書型宣言では、公開識別子の-//W3C//DTD HTML 4.01 Transitional//ENとシステム識別子のhttp://www.w3.org/TR/html4/loose.dtdによって、特定のDTDがこの文書と関連付けられている。パーサはどちらかの識別子を使ってエンティティの定義を得ることができる。この例でも次の例でも、内部サブセットの指定はない。ルート要素はhtmlと指定されている。つまり、この宣言の後にはhtml要素が続くこととなる。

HTML 4.01 
HTML4.01には3種類のDTDが用意されている。厳密なStrict、移行用のTransitional、フレームを使用するFramesetである。

Strict DTDでは、CSSで行うべき文書の見た目を左右するマークアップは廃されている。そのStrict DTDを指定するための文書型宣言は以下のようになる。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

Transitional DTDでは、非推奨となった要素や属性を使うことができる。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

フレームを使う場合、以下のようにしてFrameset DTDを指定する必要がある。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

XHTML 1.0 

XHTML 1.0にはHTML 4.01と同じく、Strict、Transitional、Framesetという3種類のDTDが存在する。

Strict DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

Transitional DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

Frameset DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

XHTML 1.1 
XHTML 1.1はモジュール化が行われている、標準化された中では最新のXHTMLである。XHTML 1.0 Strictの流れを受け継ぐ1通りのみのDTDとなった。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

XHTML Basic 

XHTML Basic 1.0

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
  "-//W3C//DTD XHTML Basic 1.0//EN"
  "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">

XHTML Basic 1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
  "-//W3C//DTD XHTML Basic 1.1//EN"
  "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">

XHTML Mobile Profile 

XHTML Mobile Profile 1.0

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
  "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
  "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

XHTML Mobile Profile 1.1

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
  "-//WAPFORUM//DTD XHTML Mobile 1.1//EN"
  "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile11.dtd">

XHTML Mobile Profile 1.2

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
  "-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
  "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">

XHTML + RDFa 

XHTML+RDFa 1.0

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
    "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html lang="ar" dir="rtl" xmlns="http://www.w3.org/1999/xhtml">

HTML5 
<!DOCTYPE html>

HTML5はSGMLベースでなく、公式のDTDは存在しない（ただし、有志によって開発されたものは存在する）。そのためHTML5の文書型宣言は文書とDTDを関連付けるという機能を果たしていない。宣言に入れるものはルート要素の名前、HTMLだけである。大文字小文字は区別されない。

XHTML5では、XMLの文法制約から大文字小文字が区別され、<!DOCTYPE html>という形で書くこととなる。DOCTYPEはすべて大文字とする必要がある。

XHTML5において、文書型宣言は必須ではなく、省略してしまっても構わない。ただし、同じ文書をHTMLとしても解釈する必要があるなら、文書型宣言を付けることが推奨される。逆に、XHTML5の要素をXML名前空間に入れる場合、DOCTYPEを使うことはできない。