作者fbysss
关键字:XML
一个定义Email的例子
<?xml version="1.0">
<!DOCTYPE message[
<!ELEMENT message(header,body,signature,footer)> --定义了message的子元素
<!ELEMENT header(date,from,to,subject,banner)> --header还有子元素
<!ELEMENT footer ANY>
<!ELEMENT body (#PCDATA)>
]>
元素的命名:元素名的第一个字母必须是字母、或下划线(_)、或冒号(:),
后跟字母、数字、句号(.)、冒号、下划线、连结号(-)的组合,并且不能包含空白符,不能以“xml”开头。
一、元素声明:
<!ELEMENT name content>
其中,name是一个标准xml标记的名字。比如dict,city等,content由以下几种构成:
1.EMPTY--定义空元素,该元素只能有属性而不会有字符数据或子元素 比如<img src="aaa.jpg"/>或者<img src="aaa.jpg"></img>
2.ANY--可以是任何内容 (除了根元素,其它最好不要使用)
3.#PCDATA类型--不包含其它子元素而只包含字符数据(数字字母和符号都可以,但不包括子元素节点)的元素,应
该说,这是最常用的类型了。
它代表“已编译的字符数据”(parsed character data)
4.子元素类型--描述包含在本元素中的子元素顺序和重复次数的内容模型
(1)序列:所有子元素必须出现且仅出现一次,而且要依次出现。序列中不能出现#PCDATA。
<!ELEMENT message(header,body,signature,footer)> 就是一个序列定义,xml中的body必须在header之后出现
(2)选择:
<!ELEMENT message(header,body,signature,(footer|foot2))>
也就是或的意思,一目了然,不多写了
5.混合类型:某元素既包含子元素又包含已编译的字符数据。语法:
<!ELEMENT pick(#PCDATA |one|two|three)*>
二、元素声明指示符:
?:元素出现0次或者1次
*:0-n次
+:1-n次
(): 一组要共同匹配的表达式
|:OR,或
,:AND,要求严格遵从顺序要求
例子1:<!ELEMENT header(date,from,to+,subject,banner)> to元素必须有,而且可以有多个。比如
<to>aaa</to>
<to>bbb</to>
例子2:
<!ELEMENT body (paragraph* )>
<!ELEMENT paragraph* (#PCDATA)>
<paragraph>元素可有可无,也可以有多个
三、属性定义<!ATTLIST 元素名称 属性名称 类型 默认值|#IMPLIED [#REQUIRED|#FIXED]>
例子:<!ELEMENT year (#PCDATA)>
<!ATTLIST year format CDATA #IMPLIED>
其中,CDDATA表示属性的值由字符数据组成,而不含标记符(似乎有点像#PCDATA)。#IMPLIED表示属性没有默认值,#REQUIRED表示必须设定这个属性,#FIX表示固定不变的值。
四、实体定义
一种替代机制,节省输入字符和时间。
1.内部一般实体:
<!ENTITY sss "the author is fbysss">
在xml中输入&sss;解析的时候,会自动解析为"the author is fbysss"
MSDN上也有说明:http://msdn2.microsoft.com/zh-cn/library/ms256483.aspx2.外部一般实体
<!ENTITY sss SYSTEM "sss.ent">
sss.ent是一个外部文件,内容就是the author is fbysss
3.参数实体
<?xml version="1.0" standalone="no"?> --standalone="no"表示本xml需要外部文件的支持
<!DOCTYPE message[
...
...
<!ENTITY % date SYSTEM "message.ent"> --注意%两边必须有空格
%date;
]>
---------------------------------------------------------
message.ent的内容如下
<!ELEMENT data (day,month,year)>
<!ELEMENT day (#PCDATA)>
<!ELEMENT month (#PCDATA)>
<!ATTLIST month type(numeric|character) #REQUIRED>
<!ELEMENT year (#PCDATA)>
<!ATTLIST year format type(numeric|character) "numeric">
----------------------------------------------------------
%date;这句相当于把message.ent的内容包含了进来。
4.不可解析的实体:
用于嵌入非文本的内容,要加关键字NDATA
<!ENTITY sssphoto SYSTEM "sss.jpg" NDATA jpg>--这里也可以使用Url比如
http://www.fbysss.com/images/sss.jpg<!ENTITY NOTATION jpg SYSTEM "image/jpeg">
嵌入多个不可解析实体(见http://edu.cnzz.cn/NewsInfo/396.aspx)
在某些特殊场合下,一个单一的属性甚至一个标识号,可能需要引用不止一个的不可析实体。就可以声明占位符
元素的属性为ENTITIES类型。ENTITIES属性值由空格分隔的多个不可析实体名组成,每个实体名都指向一个外部
非XML格式数据资源,并且必须在DTD中声明所有实体。例如,可以用这种方法编写一个以幻灯放映元素来切换不
同的图片,DTD需要如下形式的声明:
<!ELEMENT SLIDESHOW EMPTY>
<!ATTLIST SLIDESHOW SOURCES ENTITIES #REQUIRED>
<!NOTATION JPEG SYSTEM "image/jpeg"
<!ENTITY HARM SYSTEM "charm.jpg" NDATA JPEG>
<!ENTITY MARJORIE SYSTEM "marjorie.jpg" NDATA JPEG>
<!ENTITY POSSUM SYSTEM "possum.jpg" NDATA JPEG>
<!ENTITY BLUE SYSTEM "blue.jpg" NDATA JPEG>
然后,在文档中需要幻灯放映出现的位置上,就可插入如下标记:
<SLIDESHOW SOURES="CHARM MARJORIE POSSUM BLUE">
五、DTD引用:有内部DTD、外部个人DTD和外部公用DTD,用的最多的就是外部公用了
外部公用DTD引用
DTD名称只能包含字母、
数字、空格和下面的符号:_%$#@()+:=/!*;?。同时,DTD名称还必须符合一些标准的规定。
例如,ISO标准的DTD以“ISO”三个字母开头;被改进的非ISO标准的DTD以加号“+”开头;未被改进的非ISO标准的DTD以减号“-”开头。无论是哪一种情况,开始部分后面都跟着两个斜杠“//”及DTD所有者的名称。在这个名称之后又是两个斜杠“//”,再然后是DTD所描述的文件的类型。最后,在又一对斜杠之后是语言的种类(参见ISO 639)。