schema&dtd
一个文档满足了 XML 文档格式规定才算是一个 XML 文档,但是随便一个 XML 文档其实对我们意义不大,因为 XML 并不是为哪项特定应用而设计的,其结构也千变万化,所以我们必须规定 XML 文档的结构以便我们创建,解析和交换 XML 文档.
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,head,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT head(#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>zhudansheng</to> <from>zhudansheng1987</from> <head>header</head> <body>forget</body> </note>
DTD 里面的结构块:
l Elements
<message>some message in between</message>
这就是一个元素, element 是组成 XML 的主要成分。
常用写法:
<!ELEMENT element-name EMPTY> 空 element 比如: <br />
<!ELEMENT element-name ANY> 包含任何内容的 element ,前提是内容合法。
<!ELEMENT element-name (#PCDATA)> 只含有字符信息的 element 。
<!ELEMENT element-name (child-element-name,child-element-name,.....)> 包含若干子 element 的 element 。注意,子节点必须按照这里定义的顺序出现。
下面是关于出现次数的一些写法:
<!ELEMENT element-name (child-name)> 子节点出现且只出现一次。
<!ELEMENT element-name (child-name+)> 一次或者多次。
<!ELEMENT element-name (child-name*)> 零次或者多次。
下面是一些组合用法:
<!ELEMENT note (to,from,header,(message|body))> “ | ”用法提供“或”的功能。
<!ELEMENT note (#PCDATA|to|from|header|message)*> 这句的意思是 note 元素可以包含零个或者多个( #PCDATA|to|from|header|message )中任意的一个元素或文本。
l Attributes
属性是用来对元素的附加特性进行描述,他以名值对的形式出现。如:
<img src="computer.gif" />
下面是属性的表示方法:
<!ATTLIST element-name attribute-name attribute-type default-value>
Attribute Types:
Value | Explanation |
CDATA | 文本 |
(en1|en2|..) | 规定属性值必须是列表中的一个 |
ID | 属性值必须唯一 |
IDREF | 属性值是另外一个 element 的 ID |
IDREFS | 属性值是一个 ID 列表 |
NMTOKEN | 属性值是一个合法的 XML name |
NMTOKENS | 属性值是一个合法的 XML name 列表 |
ENTITY | 属性值是一个 entity |
ENTITIES | 属性值是一个 entity 列表 |
NOTATION | 属性值是一个 notation |
xml: | 属性值是一个预定义 xml value |
Default Value:
Value | Explanation |
value | 默认值 |
#REQUIRED | 属性是必须的 |
#IMPLIED | 属性是可选的 |
#FIXED value | 属性是固定值的 |
那么假如我们想要规定 payment 元素的一个叫做 type 的属性,他必须是 check 或者 cash ,而且默认是 cash ,我们需要这样写:
<!ATTLIST payment type (check|cash) "cash">
l Entities
Entity References | Character |
< | < |
> | > |
& | & |
" | " |
' | ' |
这个不用多说了 J 。在 HTML 里我们不是常用 么,哈哈。
但是值得一提的是 entity 可以自定义 J ,上面的不过是 XML 预定义的而已。
Entity 的定义既可以是内部的,也可以是外部的。
内部定义:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
这两行定义了两个 entity ,下面是在 XML 文档里的引用
<author>&writer;©right;</author>
外部定义:
<!ENTITY writer SYSTEM "http://www.w3schools.com/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/dtd/entities.dtd">
这里定义了两个外部 entity ,但是不影响引用。
<author>&writer;©right;</author>
有些像宏定义,不是么?
l PCDATA
Parsed character data 。
PCDATA 在经过 XML 解释器的时候会被解析,其中的标签和 Entity 都会被按照 XML 的规定解释。
比如 <body> 会被认为是一个 element 的开始,而一个 & 会被解释为 & 。
l CDATA
与 PCDATA 相对的一种用法,里面的字符保持原样,不会被解释器解释