前回のnoteでは、文書の種類を分類する際に、その文書がDTDとスキーマのどちらを使用し準拠しているかに基づいて、整形式XMLと有効なXMLに区別していました。では、DTDとスキーマとは何でしょうか。 DTD とスキーマはどちらも XML ドキュメントを標準化し、XML ドキュメントにセマンティック制約を課すために使用されます。一方、DTD はシンプルで使いやすく、スキーマは強力です。このnoteでは、まずDTD(Document Type Definition、文書型定義)について学びます。
1. XMLドキュメントでDTDを使用する方法
インポート方法 | 構文形式 | 手順 |
内部DTD |
| DTD 定義を XML ドキュメント内の Behind の直後に配置します。 XML 宣言と処理命令 例:]>
|
<!DOCTYPE 根元素名[ 元素描述]> ログイン後にコピー
| DTD をファイル内で個別に定義し、キーワード SYSTEM を使用して DTD をインポートします 例:
| |
<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI"> ログイン後にコピー
| パブリック DTD、この DTD は通常、特定の業界または公共の使用のために権威ある組織によって指定され、キーワード PUBLIC を通してインポートされます 例:
|
DTD document これは XML ドキュメントそのものではありませんが、XML の意味上の制約を定義するドキュメントです。 DTD ドキュメントの構文は非常に単純で、次の構造になっています:
(1) 最初の行は DTD ドキュメントの宣言です。構文は XML の宣言と同じです
( 2) 0 から複数のコメント部分、DTD コメントは XML コメントと同じ構文になります
(3) 0 から複数の 定義、それぞれ XML 要素を定義します
(4) 0 からその他の は XML 要素の属性を定義します
(5) 0 から複数の 定義、各
(6) 0 から複数の 定義、それぞれ シンボルを定義しますそのうち 4 つは 、、、<です。 ;!NOTATION...> 定義は互いに完全に独立しており、相互にネストする必要はありません。以下で 4 つの定義を 1 つずつ説明します。
3. 要素の定義
(1) ETD と呼ばれる要素タイプの定義
(2) 要素タイプ
要素タイプ
説明 | 任意のタイプ | |
要素は文字列、空の要素、またはサブ要素を含むことができます | 文字列値 | |
要素値 It文字列であり、空の要素ではなく、サブエレメントを含むこともできません。サブ要素間の順序やサブ要素の出現数などを詳細に定義する必要がある | 混合型 | |
指定できる値はいくつかの特定の型のみであり、どの型よりも強い制約がありますが、関数は可能な限り混合型を使用する必要があります | 。 | 混合型の定義に関するいくつかのポイント: |
B: #PCDATA と各サブ要素を区切るには縦棒 (|) のみを使用できます。カンマは使用しないでください | C を区切る: サブ要素の後に ?、*、+ などの周波数修飾を使用しないでください。 シンボル | (3) サブ要素を定義します |
サブ要素の構文を定義します | 説明 | サブ要素の周波数修飾子 |
(サブ要素 1、サブ要素 2、...)
順序付けされたサブ要素を定義するには英語のカンマを使用します
デフォルト (修飾子なし)
表示一度だけ
(サブ要素 1|サブ要素 2|...) | 垂直線を使用して相互に排他的な子要素を定義します | ? | は 0 回または 1 回発生します | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
((child要素 1、子要素 2) | (子要素 3、子要素 4)) | 子要素をグループ化するには括弧を使用します | + | が 1 回以上出現します | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(子要素 1|子要素 2|。 ..)+ | 縦棒の相互排他を使用し、頻度変更を使用して順序のない子要素を定義します | * | が 0 回以上出現します | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
类型 | 说明 |
CDATA | 该属性值只能是字符串数据 |
(en1|en2|en3) | 该属性值必须是一系列枚举值之一 |
ID | 该属性值必须是有些的标识符,且该属性值可用于标识该元素,因此必须在此XML文档中唯一 |
IDREF | 该属性值必须是引用另一个已有的ID类型的属性值 |
IDREFS | 该属性值必须是引用已有的一个或多个ID类型的属性值,多个ID类型的属性值之间使用空格分隔 |
NMTOKEN | 该属性值必须是合法的XML名称,必须是字符串数据,比CDATA约束更强,只能由字母、数字、下划线、中划线,点号和冒号组成 |
NMTOKENS | 该属性值必须是一个或多个NMTOKEN类型的属性值,多个使用空格分隔 |
ENTITY | 该属性值是一个外部实体,比如图片 |
ENTITIES | 该属性值是一个或多个ENTITY类型的属性值,多个使用空格分隔 |
NOTATION | 该属性值是在DTD中声明过的符号(NOTATION),这是个将要过期的规范,尽量避免使用 |
xml: | 该属性值是一个预定义的XML值 |
(2)元素对属性的约束与默认值的关系
元素对属性的约束 | 说明 | 默认值 |
未指定 | 必须指定默认值 | |
#REQUIRED | 必须的属性,必须为相应元素提供该属性 | 不能指定默认值 |
#IMPLIED | 该属性可有可无 | 不能指定默认值 |
#FIXED | 该属性值是固定的,定义时必须指定固定值 | 必须指定默认值 |
5、定义实体
实体引用就是用一个字符串代替另一个字符串,类似于C语言中的宏,上一篇笔记中已经提到过XML中内置的5个实体引用,在这里接着看看怎么自定义实体引用。
实体类型 | 使用场所 | 定义语法 | 使用语法 | 说明 |
普通实体 | XML | &实体名; | ||
参数实体 | DTD | %实体名; | 必须在使用前先定义 | |
外部实体 | XML | &实体名; | 这里外部文件必须是满足XML文档结构的文本文档 | |
公用外部实体 | XML | &实体名; | ||
外部参数实体 | DTD | %实体名; | ||
公用外部参数实体 | DTD | %实体名; | ||
未解析实体 | XML | 需要通过ENTITY等类型的属性调用 | 未解析实体不能由XML文档解析,而需要根据相应的符号名去解析 | |
公用未解析实体 | XML |
6、定义符号
定义符号也有两种语法格式,分别定义普通符号和公用符号:
符号类型 | 定义语法 |
普通符号 | |
公用符号 |
符号值通常有两种形式:
(1)MIME:通用MIME类型的文件总是由相应的程序负责处理
(2)外部程序所在路径:直接指定某个外部程序负责处理XML文档中的外部数据
符号通常有两种用途:
(1)如上,符号可以用来定义未解析实体
(2)符号可以作为ENTITY或ENTITIES类型的属性值
(3)符号还可以作为NOTATION类型的属性的值,定义NOTATION类型的属性时,语法如下:
<!ATTLIST 属性所属的元素 属性名 NOTATION (值1|值2|...) 约束 默认值>
比一般的属性定义多一个值的列表。