【通用】文档类型定义(DTD)
文档类型定义(DTD):可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
为什么使用DTD:
通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
还可以使用 DTD 来验证自身的数据。
声明
内部声明
XML <!DOCTYPE root-element [element-declarations]> |
---|
示例:
| XML
<?xml version=”1.0”?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
XML示例:
Don’t forget me this weekend
外部声明
XML <!DOCTYPE root-element SYSTEM “filename”> |
---|
示例:
XML <?xml version=”1.0”?> <!DOCTYPE note SYSTEM “note.dtd”> Don’t forget me this weekend! |
---|
上面示例中引用的外部note.dtd文档如下:
XML <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> |
---|
XML 构建模块
由以下几个部分组成:
元素:元素是 XML 文档的主要构建模块。元素可包含文本、其他元素或者是空的。
属性:可提供有关元素的额外信息。属性总是被置于某元素的开始标签中。属性总是以键/值的形式 成对出现的。
XML |
---|
实体:实体是用来定义普通文本的变量。实体引用是对实体的引用。当文档被 XML 解析器解析时,实体就会被展开。
XML解析器定义的5种标准实体 | |
---|---|
实体引用 | 字符 |
< | < |
> | > |
& | & |
" | “ |
' | ‘ |
PCDATA:被解析的字符数据(parsed character data)。
字符数据为XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA:字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
元素
元素声明语法
XML <!ELEMENT element-name category> <!ELEMENT 元素名称 关键字> 或 <!ELEMENT element-name (element-content)> <!ELEMENT 元素名称 元素内容> |
---|
空元素
使用EMPTY关键字进行声明:
| XML
<!ELEMENT element-name EMPTY>
实例:
<!ELEMENT br EMPTY>
XML 示例:
|
| —- |
只有 PCDATA 的元素
通过圆括号中的 #PCDATA 进行声明:
| XML
<!ELEMENT element-name (#PCDATA)>
实例:
<!ELEMENT from (#PCDATA)> |
| —- |
可以带有任何内容的元素
通过类别关键词 ANY 声明的元素:
| XML
<!ELEMENT element-name ANY>
实例:
<!ELEMENT note ANY> |
| —- |
带有子元素(序列)的元素
通过圆括号中的子元素名进行声明:
| XML
<!ELEMENT element-name (child1)>
或
<!ELEMENT element-name (child1,child2,…)>
实例:
<!ELEMENT note (to,from,heading,body)> |
| —- |
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
声明只出现一次的子元素
| XML
<!ELEMENT element-name (child-name)>
实例:
<!ELEMENT note (message)>
|
| —- |
声明最少出现一次的子元素
| XML
<!ELEMENT element-name (child-name+)>
实例:
<!ELEMENT note (message+)>
|
| —- |
声明出现零次或多次的子元素
| XML
<!ELEMENT element-name (child-name*)>
实例:
<!ELEMENT note (message)>
<!— 用星号()声明了:子元素 message 可在 “note” 元素内出现零次或多次 —> |
| —- |
声明出现零次或一次的子元素
| XML
<!ELEMENT element-name (child-name?)>
实例:
<!ELEMENT note (message?)>
|
| —- |
声明”非…/即…”类型的内容
XML 实例: <!ELEMENT note (to,from,header,(message|body))> |
---|
声明混合型的内容
XML 实例: <!ELEMENT note (#PCDATA|to|from|header|message)*> |
---|
属性
属性声明语法
| XML
<!ATTLIST element-name attribute-name attribute-type attribute-value>
<!ATTLIST 元素名称 属性名称 属性类型 默认属性值>
DTD 实例:
<!ATTLIST payment type CDATA “check”>
XML 实例:
属性类型(attribute-type)选项:
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1|en2|..) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml | 值是一个预定义的 XML 值 |
默认属性值可使用下列值 :
值 | 解释 |
---|---|
value | 属性的默认值 |
#REQUIRED | 属性值是必需的 |
#IMPLIED | 属性不是必需的 |
#FIXED value | 属性值是固定的 |
默认属性值
| XML
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA “0”>
XML:
|
| —- |
#REQUIRED
| XML
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的 XML:
非法的 XML:
|
| —- |
#IMPLIED
| XML
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:
合法的 XML:
|
| —- |
#FIXED
| XML
DTD:
<!ATTLIST sender company CDATA #FIXED “Microsoft”>
合法的 XML:
非法的 XML:
|
| —- |
列举属性值
| XML
DTD:
<!ATTLIST payment type (check|cash) “cash”>
XML 例子:
或
|
| —- |
元素VS属性
在XML中,并没有规定何时使用属性,以及何时使用子元素。
数据可以存储在子元素或属性。
| XML
在第一个例子中”sex”是一个属性。在后面一个例子中,”sex”是一个子元素。但是两者都提供了相同的信息。
避免使用属性
属性不能包含多个值(子元素可以)
属性不容易扩展(为以后需求的变化)
属性无法描述结构(子元素可以)
属性更难以操纵程序代码
属性值是不容易测试,针对DTD
如果使用属性作为数据容器,最终的XML文档将难以阅读和维护。 尝试使用元素来描述数据。只有在提供的数据是不相关信息时才建议使用属性。
实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
内部实体声明
| XML
语法:
<!ENTITY entity-name “entity-value”>
DTD 示例:
<!ENTITY writer “Donald Duck.”>
<!ENTITY copyright “Copyright runoob.com”>
XML 示例:
|
| —- |
外部实体声明
| XML
语法:
<!ENTITY entity-name SYSTEM “URI/URL”>
DTD 示例:
<!ENTITY writer SYSTEM “http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM “http://www.runoob.com/entities.dtd">
XML 示例: