XML基本语法
文档声明的具体语法格式
<?xml version=“1.0” [encoding=“编码方式”] [standalone=“yes|no”]?>
version: 必需包含该属性,指明以下文档遵循哪个版本的XML规范。
该属性必须放在其它属性之前,属性的合法值一般为1.0。
encoding:该属性可省略,指明文档中的字符编码方式。
省略该属性时,默认值为utf-8。
standalone:该属性可省略,指定文档是否和一个外部文档配套使用。.
该属性为yes说明当前XML文档是一个独立的XML文档,否则相反。
当省略该属性时,属性的默认值为yes。
文档类型声明
文档类型声明是对外部 DTD 文件的引用。格式如下:
处理指令
处理指令(Processing Instructions,简称PIs)允许文档中包含由应用程序来处理的指令。在XML文档中,有可能会包含一些非XML格式的数据,XML处理器无法处理这些数据,我们就可以通过处理指令来通知其它应用程序来处理这些数据。
处理指令(PI)的语法和XML声明类似,以“<?”开始并以“?>”结束。常见的使用样式表单的处理指令如下所示。
<?xml-stylesheet href="hello.css" target="_blank" rel="external nofollow" type="text/css"?>
<?xml-stylesheet href="hello.xsl" target="_blank" rel="external nofollow" type="text/xsl"?>
注释
以“<!- - ”开始,以“- ->”结束
实体引用
有 5 个预定义的实体引用,只有字符 “<” 和 “&” 确实是非法的
CDATA段
CDATA段以字符串“<![CDATA[”开始,以字符串“]]>”结束。中间包含的都是纯字符数据,但字符数据可以是不包含CDATA段的结束定界符的任意字符串。在字符数据可以出现的任何地方都可以使用CDATA段。
XML的属性
属性是为元素附加信息,总是以“属性名=”属性值””的形式给出。
XML文档中所有的属性值都必须要加引号,使用时既可以使用双引号又可以使用单引号。例如:
< tag attr1=”value1” attr2=’value2’>content</ tag>
所有标签的属性值必须用双引号(“)或者单引号(‘)括起来,两者不能混合使用。例如< Tag a=’aValue”>是错误的。
建议尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
XML中使用DTD
DTD( Document Type Definition)文档类型定义。
XML对数据进行描述,而DTD对XML进行描述。
DTD在实际应用中的作用主要包括:
程序设计人员根据DTD就能够知道对应的XML文档逻辑结构,从而编写出相应的处理应用程序。
可以验证XML文档数据的有效性。
可以为某类XML文档提供统一的格式和相同的结构
可以保证在一定范围内,XML文档数据的交流和共享
引入DTD的方式
内部DTD
使用DTD的最简单的方式,内部DTD就是指将语义约束与XML文档的内容放在同一个XML文档中。紧跟在XML声明和处理指令之后,以<!DOCTYPE[开始,以]>结束语法格式如下:
<!DOCTYPE 根元素名称 [
元素描述
]>
外部DTD
外部DTD的引用将DTD的约束写到外部文件中,然后在XML文档中按以下语法格式添加:
SYSTEM关键字表示文档使用私有DTD文件,“外部DTD文件的URL”,也叫系统标识符(system identifier),可以是DTD文件的相对位置或绝对位置。
公用DTD
公用DTD引用公用的DTD地址,语法格式如下:
公共DTD名称要遵循一些约定。如果一项DTD是ISO标准,它的名字要以字符串“ISO”开始;如果是一个非ISO的标准组织批准的DTD,它的名字以“+”开始;如果不是标准组织批准的DTD,它的名字以连字符“-”开始。这些开始字符或字符串后面接//和DTD所有者的名字,之后是另一个双斜杠和DTD描述的文档类型,接着又是一个双斜杠后接ISO 639语言标识符,如EN表示英语,ZH表示中文。
DTD的基本语法
DTD内部可以包含下列语句:
元素类型声明语句<!ELEMENT ......>
属性列表声明语句<!ATTLIST ......>
实体声明语句<!ENTITY .......>
注释语句< !-- -->
DTD中的元素定义
语法如下所示:
语法详细说明:
元素名:即文档中元素的名称。
元素类型描述:元素类型描述用于指定元素本身是否为对空元素,如果不为空元素元素的内容包括哪些。
DTD中的元素类型
元素类型具体包括以下5类:
- 字符串类型:(#PCDATA),表示该元素的内容只能是字符串。
- 包含子元素: (字元素定义),表示该元素内部嵌套其它元素,具体包含子元素可能有:有序子元素、无序互斥子元素、无序组合子元素。子元素出现的次数也会根据实际的定义而不同。
- 空元素:EMPTY,表示该元素只能是空元素。
- 任意类型:ANY,表示该标记对于元素内容没有限制,该标记的内容可以是字符串类型、也可以包含子元素、即包含字符串又包括自元素的混合类型、该标记也可以是空元素。在实际应用中尽量避免。
- 混合类型:即内容中即包括字符串类型又包括子元素,但混合类型在实际应用中不建议使用。
子元素
有序子元素
用逗号分隔,表示子元素的出现顺序必须与声明时一致,并且不能被省略。
无序互斥子元素
用竖线 | 分隔,表示任选其一,即多个子元素在文档定义中只能出现一个。
无序组合子元素
子元素出现频率可以根据不同的符号进行设定这些符号的含义
+ | 一次或多次 |
? | 0次或一次 |
* | 0次或多次 |
缺省 | 一次 |
DTD中的属性
在DTD中声明元素属性的语法:
在一个ATTLIST 中可以定义同一个元素下的一个或多个属性。当约束为#REQUIRED或者#IMPLIED,不能定义默认值。
元素名称:属性所属的元素名称
属性名:属性名称
约束:元素对属性的约束
属性类型:属性的值类型
元素对属性的约束及其含义
#REQUIRED | 表示该属性是必需的,不能没有。 |
#IMPLIED | 表示该属性可以有也可以没有。 |
#FIXED | 表示在XML文档中,属性只能设置所定义的固定值,且默认值也为改固定值 |
属性类型及其含义
CDATA | 单纯的字符数据,大部分属性都设置为该类型 |
ID | 具有唯一性的属性值,该属性值必须以字母开头 |
IDREF | 引用其它ID属性的值,该值必须在其它ID属性中存在 |
IDREFS | 引用多个其它ID属性的值,中间使用空格间隔 |
NMTOKEN | 是Name Token,就是关键字的名字。可以包含字母、数字、[.]、[-]、[_]、[:]组合的名字 |
NMTOKEYS | 多个NMTOKEN,中间使用空格间隔 |
Enumerated | 枚举类型属性,只能从已有属性选取,不能填入新项目 |
DTD中的实体
通用内部解析实体
通用内部解析实体的语法格式如下:
实体名称:实体名称由程序员自己定义,但必须满足唯一性,即不能重名。同时满足XML的命名规范。
实体内容:所需要表达的文本内容
通用外部解析实体
定义外部解析实体的语法如下:
URI/URL:所引用的外部文件的路径地址,被引用的外部文件必须是可以被解析的,扩展名没有限制。
实体为PUBLIC时才会有相应的“公共实体标识符” ,如果为SYSTEM则没有“公共实体标识符”
参数内部解析实体
声明参数内部解析实体的语法:
参数实体名称:实体名称由DTD程序员自己定义,但必须满足唯一性,即不能重名。同时满足XML的命名规范。
实体内容:所需要表达的文本内容。
参数外部解析实体
声明参数外部解析实体的语法:
URI/URL:所引用的外部文件的路径地址
引用参数实体的语法: %参数实体名称;
命名空间
标记中出现同名不同义的情况,容易造成含义混乱。命名空间就是由W3C制定的用于解决这类问题的。
命名空间的语法格式是:
xmlns[:prefix]= “命名空间字符串”
xmlns :是XML namespace的缩写即XML命名空间,这个字符串是固定的。
prefix : 表示前缀名称也称为命名空间别名,可以随意指定,通常是一个简短的名字。别名中不能包括冒号,不能使用xml和xmlns。
命名空间字符串:是一个非空的URI,通常是指向命名空间介绍文件的地址,不过URI实际上可以指向不存在的内容,在写法上保证唯一性即可。
命名空间声明主要包括两种形式:
- 没有前缀限定的命名空间。一个XML文档中至多有1个没有前缀限定的命名空间。
- 有前缀限定的命名空间。一个XML文档中可以有任意个有前缀限定的命名空间。
命名空间作用域
命名空间能够作用于声明该命名空间的元素及其子元素中。
元素在命名空间作用域内并不表示元素属于该命名空间。如果要表示某元素位于某命名空间时,需为该元素指定命名空间。指定命名空间的语法为:
命名空间别名:标记名
属性对命名空间的使用
实际应用中属性很少使用命名空间,但需要读者注意的是如果在属性上没有使用任何命名空间别名,则表示该属性不属于任何命名空间。
注:属性的命名空间是独立的,即无论属性所属的元素属于任何命名空间与属性的命名空间无关。
<?xml version="1.0" encoding="UTF-8"?>
<book
xmlns:au="http://www.dlut.edu.cn/xml/author" xmlns=”http://www.dlut.edu.cn/xml”>
<name>XML技术及应用</name>
<author au:id="x001" birthdate="19801001">
<name>唐琳</name>
<age>34</age>
</author>
</book>
DTD与命名空间
由于DTD比命名空间更早出现,所以DTD不支持命名空间。
如果在XML文件中增加了命名空间,那么DTD也要相应的修改。