SGML実体

Standard Generalized Markup Language (SGML) における実体（）は、プリミティブデータ型の1つであり、固有のエイリアス（ユーザーが指定した名前など）またはSGML予約語（codice_1 など）を1つの文字列と関連付けるものである。XMLやHTMLにおける実体 (entity) も同様である。
実体はSGML文書の構造と定義の基盤である。SGML仕様では様々な実体型 (entity type) を定義しており、キーワード修飾子と文脈で決まる。実体文字列の値としては、プレーンテキスト、SGMLタグ、事前定義された実体への参照から成る。外部文書を参照する実体型もある。実体は参照渡しである。
実体の種類.
実体は包括実体とパラメータ実体に分類される。
また、実体は解析対象と非解析対象に分類される。
内部実体と外部実体.
内部実体 (internal entity) の値はリテラル文字列か、同一文書内（DOCTYPEや部分文書など）で定義されたマークアップと実体から成る構文解析された文字列である。外部実体 (external entity) は外部文書を呼び出す宣言を持つため、外部文書への参照を解決するために実体管理系とやりとりする必要がある。
システム実体.
システム実体 (system entity) にはオプションの codice_2 パラメータがあるため、SGMLパーサはその実体の中身である文字列をリソース識別子として扱う。
SGML文書実体.
外部実体が完全なSGML文書を参照している場合、参照されている文書をSGML文書実体 (SGML document entity) と呼ぶ。SGML文書とは、SGMLプロローグ（DTDと部分文書）に定義されたSGMLマークアップを伴うテキスト文書である。完全なSGML文書は文書インスタンスだけでなく、プロローグとオプションでSGML宣言（その文書でのマークアップ構文を定義し、文字コードを宣言したもの）を備えている。
構文.
実体は文書のDTD内の「実体宣言 (entity declaration)」で定義される。以下に例を挙げる。
 <!ENTITY greeting1 "Hello world">
 <!ENTITY greeting2 SYSTEM "file:///hello.txt">
 <!ENTITY % greeting3 "¡Hola!">
 <!ENTITY greeting4 "%greeting3; means Hello!">
このDTDマークアップで宣言されているのは以下の通りである。
実体の名前はSGML名前の規則に従わなければならず、参照できる場所も制限されている。
パラメータ実体は実体名を "codice_3" と "codice_4" で挟んで参照する。解析対象包括実体は実体名を "codice_5" と "codice_4" で挟んで参照する。非解析対象実体はENTITY型で宣言された属性の値としてその名前を置くことで参照される。
上の例にある包括実体を文書内で参照した例を以下に示す。
 <content>
 <info>'&greeting1;' is a common test string.</info>
 <info>The content of hello.txt is: &greeting2;</info>
 <info>In Spanish, &greeting4;</info>
 </content>
これを構文解析するとき、hello.txt の内容が "Salutations" というテキストだったとすると、次のような結果になる。
 <content>
 <info>'Hello world' is a common test string.</info>
 <info>The content of hello.txt is: Salutations</info>
 <info>In Spanish, ¡Hola! means Hello!</info>
 </content>
宣言されていない実体を参照すると、デフォールトの実体を定義していない限りエラーとなる。例えば、次の通りである。
 <!ENTITY DEFAULT "This entity is not defined">
その他のマークアップ要素や処理オプションによって実体の処理の仕方が影響されることもある。例えば、オプション指定で外部実体を無視して処理することもある。
文字実体.
SGMLの標準実体群やそこから派生した一部には、タイピングが難しかったり文字コードが特殊などの理由で毎回本文に記述するのが面倒な文字を置き換えるという用途もある。そのような実体の中身は国際符号化文字集合の中の1文字である。どんな文字も数値文字参照で参照できるが、文字実体参照を使えば文字コードを使わずに名前で参照できる。
たとえば HTML 4 には252の文字実体が組み込まれており、宣言する必要はない。XML には5つがある。XHTML にも XML と同じ5つがあるが、DTD を明示的に使えば 253 になる（追加の1文字は codice_7）。