学习重点:DTD,XML,XML的基本语法,规范的XML格式文档,有效的XML文档(要写得出来),可以使用DTD去验证,可以使用命名空间,可以用Schema去验证,第四章里面Schema基础的东西要掌握,一二三四第六章会涉及一点,Xpath涉及一点,XXL(重点)其他就选讲
1,2,3,4,8,11,12章 6,7也会涉及一些,9,10,13不会涉及 Schema高级技术要理解
老师讲怎么复习:书上的例子全部都跑一遍,所有的习题自己思考全部都要做,类似的都要会,在XMLSpy中去理解
代码1-1 简单的XML文档
<个人信息>
<姓名>田诗琪姓名>
<生日>2011-04-11生日>
<性别>女性别>
<身高>83cm身高>
个人信息>
代码1-2 格式不良好的XML文档
<个人信息>
<姓名>田诗琪
<生日>2011-04-11生日>
<性别>女性别>
<身高>83cm身高>
个人信息>
代码1-3 有效的XML文档
]>
<个人信息>
<姓名>田诗琪姓名>
<生日>2011-04-11生日>
<性别>女性别>
<身高>83cm身高>
个人信息>
语法格式:
version:指明文档是遵循哪个版本的XML规范
encoding:默认是UTF-8,可以省略
standalone:指定该XML文档是否和一个外部文档配套使用,yes就表明当前XML文档是一个独立的文档
这个使用了一个外部的DTD文件
<!ELEMENT china(#PCDATA)>
也可以不引用外部DTD文件,直接在XML文档中给出了DTD
DOCTYPE china[
]>
mycss.css中的代码:
China{
background-color:#ffffff;
color:red;
outline:#00ff00 dotted thick;
}
常见的处理指令
(1)注释不能出现在XML声明之前
(2)注释不能出现在标记中
(3)注释可以包围和隐藏标记,但是在添加注释之后,要保证剩余的文本仍然是一个结构完整的XML文档
(4)字符串“–”不能在注释中出现
(5)在XML结尾,不允许注释以“–>”结尾
区别:标记,元素和属性
(1)标记是<>所包含的对象
(2)元素是指由开始标记,结束标记,标记内容构成的
(3)属性是元素的附加属性
XML基本语法规则
1.XML中有单标记和双标记两种
2.所有标签必须区分大小写
3.所有标签必须符合标签的命名规则
4.实际命名时有较好的阅读习惯
5.所有标签必须合理嵌套
6.所有属性的标签必须使用双引号和单引号括起来
7.XML有且只能有一个根元素
1.空元素
(1)单标记
(2)双标记(不建议使用)
!!如果中间有空格或者换行就说明这个不再是空标记
!!!空元素中也可以包含属性
2.非空元素
(1)带有文本的
(2)带有子元素的元素
(3)同时带有文本的和带有子元素的元素
元素的内容
1.字符数据——不能包含<,>,&
abc
2.字符引用和实体引用——提供了5个预定义的实体引用
3.CDATA段
以字符串 中间都是包含纯字符数据,但是字符数据可以是不包含CDATA段的结束定界符
在字符数据可以出现的任何地方都可以使用CDATA段
特别是出现特殊字符的时候,就派上用处了
例1-24 XML包含CDATA段
<java>
java>
4.空白处理
空白包括空格,制表符,空行
只是一个建议。。。
5.行尾处理
6.语言标识
xml:lang来指出XML
1.检查XML语义的相关技术
(1) DTD
(2) Schema
2.生成,解析,和检索XML文档的相关技术
(1)DOM
(2)JDOM
(3)DOM4J
(4)SAX
(5)Digester
(6)XQuery
3.显示XML文档的相关技术
(1)CSS
(2)XSLT
4.XML命名空间
编写一个XML文档
<poem><title>静夜思title><author>李白author><content><line>床前明月光line><line>疑是地上霜line><line>举头望明月line><line>低头思故乡line>content>poem>
判断下列元素的内容是否合法
& 错
/ 对
/> 对
< 错
]]> 错
3.指出下列代码错误
<java><![CDTA[ if(array[a[i]]>0){ fun();} ]]>java>
错误元素中不允许使用]]>
<teams><team><teamid>1teamid><teamname>北京xxteamname>team><team><teamid>2teamid><teamname>大连yyteamname>team><team><teamid>3teamid><teamname>上海zzteamname>team>teams>
无效的XML文档、格式良好的XML文档、有效的XML文档
逻辑构成包括:(1)XML必要声明(2)DTD声明(3)PI(处理指令)(4)元素(5)注释
1) XML必要声明
语法: ?>
位置:必须位于第一行
可以包含的属性及含义
version 必须的 XML版本 1.0|1.1
encoding 可选的 编码方式
standalone 可选的 XML文档是否独立 yes|no
2)DTD声明
语法:
内置的DTD声明
语法: ?>
位置:通常位于第一个元素之前
如果需要使用的时候给出,否则不写
PI vs xml必要声明的相同点和不同点?
(1)位置
(2)出现次数
(3)作用
4)注释
语法:
需要注意的问题:
1)不能位于必要声明之前
2)不能嵌套在标记中
3)本身不能嵌套
4)中间内容不能出现–
5)不能以—>
5)元素
分类:空元素、带属性的、带内容的、带内容且带属性的
DTD为XML文档的编写者和提供者提供共同遵守的原则
例2-1:有效的XML文档
]><根元素名称><第一个子元素 属性一="任意内容" >文本内容1第一个子元素><第二个子元素>文本内容2第二个子元素>根元素名称>
具体约束如下:
(1)XML文档内一共包含三个元素,分别是根元素名称,第一个子元素,第二个元素。
(2)由知道此处根标记为<根元素标记>
(3)由知道<根元素标记>标记内嵌了两个子标记
(4)
知道第一个元素和第二个元素,都是文本内容(5)DTD在实际应用中的作用如下: 可以验证XML文档大数据的有效性 为某类XML文档提供统一格式和相同的结构
可以保证在一定范围内XML文档的交流和共享 可以让程序设计人员根据DTD可以知道对应的XML文档逻辑结构,从而编写出相应的处理应用程序
一个DTD包含对于XML文档使用的元素,元素之间的关系,元素出现的次数,元素中可以使用的属性以及可以使用的实体和符号的定义规则
DTD内部包含下列语句:
(1)元素类型声明语句
(2)属性列表声明
(3)实体声明语句
(4)符号声明语句
(5)注释语句
DTD被定义为单独文件的例子
定义了元素root,sub1,sub2
指明嵌套关系为root内嵌套sub1和sub2两个子元素,这两个子元素是有序的,只出现一次
属性列表,定义属性为root元素的属性,属性名分别为param1和param2,需要注意属性是无序的
param1 类型为NOTATION,属性值只能从Jpeg|Png二选一
#REQUIRED表示属性必须的
XML中引用DTD文档
DOCTYPE root SYSTEM "practice.dtd">不仅指出了被引用的DTD文档之外,还指出了文档的根标记是root标记<root param1 ="Jpeg"> <sub1> &NAME;sub1><sub2>any wordsub2> root>
*注意使用DTD文档必须使用XML的文档类型声明标记,本例引用的是外部的DTD文档
注意实体引用时,实体名称前面加”&",实体名称后面加";"
]>&NAME; any word
1.内部DTD
语法格式:
DOCTYPE 根元素描述[元素描述]>
2.外部DTD
外部DTD的引用需要事先有一个DYD文件,将DTD约束写入文件中,然后在XML文档中按照以下格式
语法格式描述:
DOCTYPE (根元素名称)SYSTEM “外部DTD的URL地址>
SYSTEM关键字表示文档使用是私有的DTD文件,外部DTD的URI可以使相对的也可以是绝对的。外部DTD的URI被称为系统标识符
例子(1)不同位置的多个XML文档要使用同一个DTD文档,可以使用URI来指明DTD文件地址
(2)如果引用DTD的WEB文档与DTD文件在同一个web服务器上,也可以使用相对URI
DOCTYPE greeting SYSTEM"/xl/dtds/hello.dtd">DOCTYPE greeting SYSTEM"/dtds/hello.dtd">DOCTYPE greeting SYSTEM"../hello.dtd">DOCTYPE greeting SYSTEM "hello.dtd">
3.公用DTD
语法格式
DOCTYPE (根元素名称) PUBLIC "DTD的标识名" "公用DTD的URL地址">
公共DTD要遵守一些约定,如果是“ISO"开头,那么它的名字要以字符串"ISO"开始。标准组织批准的DTD,名字以”+“开始,不是的话以”-“开始
!!前面所提到的,如果文档不依赖于外部文档,在XML声明中可以通过standalone="yes"声明这个文档是独立的文档
当我们使用外部DTD文档时,需要设置standalone=“no”
具体语法
*元素名:在同一个DTD文件中元素名必须唯一。一旦给一个元素命名,那么在整个文档中大小写都要使用相同的。
*元素类型具体包括
1.字符串类型
2.空元素
3.子元素
4.混合元素
5.任意类型
1.EMPTY——空元素,
例2-4 空元素的定义
DOCTYPE root[<!ELEMENT root (sub1,sub2)><!ELEMENT sub1 EMPTY><!ELEMENT sub2 EMPTY>]><root><sub1>sub1><sub2/>root>
2.任意元素类型
ANY表示元素的内容为任意类型。
例 2-5 任意内容类型元素的定义
DOCTYPE root[<!ELEMENT root (sub1*)><!ELEMENT sub1 ANY><!ELEMENT sub2 EMPTY>]><root><sub1/><sub1>ANY WORDsub1><sub1><sub2/>sub1><sub1>ANY<sub2/>WORDsub1>root>
上述的代码sub1 为任意内容类型元素,为空元素,ANY WORD字符串类型元素
子元素类型元素 ANYWORD混合内容类型元素
3.字符串类型
在DTD中可以将所有不包含子标记的元素定义为字符串类型,例如(#PCDATA)
例 2-6 字符串类型元素的定义
DOCTYPE root[<!ELEMENT root (sub1*)><!ELEMENT sub1 (#PCDATA)><!ELEMENT NAME"ENTITY VALUE">]><root><sub1/><sub1>ANY WORDsub1><sub1>&NAME;sub1>root>
字符串内容中包含可解析实体引用也是被允许的
4.子元素
当元素类型定义为子元素时,,必须使用小括号(),元素与元素之间用,隔开表示有序的。元素与元素之间用|隔开表示互斥的
(1)有序子元素,用逗号隔开,表示子元素的出现顺序必须与声明时一致。
<!ELEMENT MYFILE(TITLE,AUTHOR,EMAIL)>表示MYLIFE包括三个子元素,而且必须按顺序出现
(2)无序互斥子元素,用|隔开,表示任选其一
例如<!ELEMENT MYFILE(TITLE|AUTHOR|EMAIL)>表示MYLIFE只能选择其中一个作为MYLIFE子元素
(3)无序组合子元素
+————一次或者多次
?————0次或者一次
*————0次或者多次
省略————一次;
例 2-9 子元素出现的频率示例
DOCTYPE root[<!ELEMENT root (sub+,sub2?,sub3*,(sub4,sub5)+)><!ELEMENT sub1 (#PCDATA)><!ELEMENT sub2 (#PCDATA)><!ELEMENT sub3 (#PCDATA)><!ELEMENT sub4 (#PCDATA)><!ELEMENT sub5 (#PCDATA)>]><root> <sub1>sub11sub1><sub2>sub22sub2><sub4>sub4sub4><sub5>sub5sub5><sub4>sub4sub4><sub5>sub5sub5>root>
还可以写无序组合子元素
表示元素sub5包含sub6和sub7,这两个元素即可以单独出现也可以同时出现,出现次数和顺序没有限制5.混合类型
混合类型定义的子元素即可以包含字符串也可以包含子元素,定义方法:
不建议使用。。。
在DTD中声明元素属性的语法:
<!ATTLIST 元素名 [属性名1 属性类型 [约束] [默认值]] [属性名2 属性类型 [约束] [默认值]] …>
说明:
在一个ATTLIST 中可以定义同一个元素下的一个或多个属性。如果包含多个属性声明,属性声明之间使用空格间隔。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1NwhWyx5-1631502088719)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210527135805936.png)]
默认值:只有当约束为#FIXED时,才能给默认值
例 2-12 属性定义的示例代码
DOCTYPE root[<!ELEMENT (#PCDATA)><!ATTLIST root reqParam CDATA #REQUIRED><!ATTLIST root impParam CDATA #IMPLIED> fixParam CDATA #FIXED "default value"> ]>root>
属性类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekRrsoAe-1631502088721)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210527140444653.png)]
(1)CDATA类型
要求属性必须是字符数据类型
例 2-13 CDATA类型属性代码
DOCTYPE root[<!ELEMENT root (book+)><!ELEMENT book (#PCDATA)><!ATTLIST book description CDATA #REQUIRED>]><root><book description="一本经典书">JAVAbook><book description="">JSPbook>root>
(2)ID IDREF IDRFS类型
ID类型要求属性的属性值是唯一的,特别注意,属性值要去必须以字母开头,而且必须是有效的XML标识符
IDREF类型要求属性值必须是一个已经存在的ID类型值
IDRFS类型表示属性值可以引用多个已经存在ID类型值,中间用空格间隔
例 2-14 ID IDREF IDREFS类型属性代码
DOCTYPE root[<!ELEMENT root (book+,person+)><!ELEMENT book (#PCDATA)><!ELEMENT person (#PCDATA)><!ATTLIST book id ID #REQUIRED borrowed IDREFS #REQUIRED><!ATTLIST person num ID #REQUIRED borrow IDREF #REQUIRED> ]><root><book id="a01" borrowed="s01 s02">JAVA 编程book><book id="a02" borrowed="s03">JSP编程book><person num="s01" borrow="a01">张三person><person num="s02" borrow="a01">李四person><person num="s03" borrow="a02">王五person>root>
(3)Enumerated类型
枚举类型
例2-15 枚举类型属性代码
DOCTYPE root[<!ELEMENT root (#PCDATA)><!ATTLIST root day (周一|周二|周三|周四|周五|周六|周天) #REQUIRED>]><root day="周一">root>
必须从七个属性值里面选择一个作为实际的属性值
(4)NMTOKEN和NMTOKNS类型
NMTOKEN属性值只能由字母,数字,下划线,英文的画线,英文点,英文冒号
而且是预先定义好的
Enumerated只能在诸多技能中,选择写出了一个属性值。将技能定义为NMTOKENS类型,最擅长的技能定义为NMTOKEN类型
例 2-16 NMTOKEN和NMTOKNS类型
DOCTYPE root[<!ELEMENT root (person+)><!ELEMENT person (#PCDATA)><!ATTLIST person skills NMTOKENS #REQUIRED bestskill NMTOKEN #REQUIRED>]><root><person skills="游戏" bestskill="游戏">张三person> <person skills="java c php" bestskill="c">张三person> root>
(5)ENTITY,ENTITIES和NOTAION类型
ENTITY类型:表示该属性值为未解析的外部实体
ENTITIES类型:表示该属性值为多个未解析的外部实体
NOTAION类型、、、、不推荐使用
1.实体:按照使用方式划分为普通实体和参数实体
普通实体划分为内部实体和外部实体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3JOgTpf-1631502088723)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210527151055856.png)]
(1)通用内部解析实体
语法格式:
<!ENTITY 实体名称 "实体内容">
内部实体可以在XML文档中进行引用
语法格式:&实体名称;
例2-17
DOCTYPE aa[<!ELEMENT aa(#PCDATA)><!ENTITY copyright"<aa>是根标记">]><aa>©right;aa>
在实体中可以嵌套调用,但是不能两个实体互相嵌套调用,会有死循环
(2)通用外部解析实体
引用外部的一个文件,被引用的实体必须是可解析的,扩展名没有限制
语法如下
例2-18
DOCTYPE aa[<!ELEMENT aa(#PCDATA)><!ENTITY copyright SYSTEM"other.text">]><aa>©right;aa>
(3)通用外部未解析实体
语法格式如下
外部解析实体只能在外部DTD文件中定义,实体只能定义为ENTITIES或者ETITY类型
例2-19外部DTD文件
<!ELEMENT aa (#PCDATA)><!ENTITY PICTURE SYSTEM "pic.jpg" NDATA msp><!ENTITY PICTURE SYSTEM "pic1.jpg" NDATA msp><!ENTITY PICTURE SYSTEM "pic2.jpg" NDATA msp><!NOTATION msp SYSTEM "mspaint.exe"><!ATTLIST aa bgImage ENTITY #REQUIRED backImages ENTITIES #REQUIRED>
上述代码,aa元素包含了两个属性,bgImage属性被定义为ENTITY ,该属性的属性值是一个外部未解析实体的名称。
bgImages属性被定义为ENTITIES ,该属性的属性值是一个或多个外部未解析实体的名称。
在DTD定义了三个外部未解析实体PICTURE,PICTURE1,PICTURE2
例子 2-20 XML文件源代码
DOCTYPE aa SYSTEM "outerunparseenity.dtd"><aa bgImage="PICTURE" backImages="PICTURE1 PICTURE2">aa>
(4)参数内部解析实体
语法格式
引用实体的语法如下:
%参数实体名称;
例 2-21 内部参数解析实体
DOCTYPE root[<!ENTITY % shopattr " name (#PCDATA)><!ELEMENT address(#PCDATA)><!ELEMENT size(#PCDATA)>"><!ELEMENT root (shop)+><!ELEMENT shop (name,address,size)>%shopattr;]><root><shop><name>物美name><address>文一路address><size>旗舰店size>shop>root>
(5)参数外部解析实体
引用参数实体的语法
%参数实体名称;
通过参数外部解析实体可以实现DTD文件的复用
<!ELEMENT A(NAME_A)><!ELEMENT NAME_A(#PCDATA)>
上述DTD定义了两个元素,分别是A和NAME_A
<!ELEMENT B(NAME_B)><!ELEMENT NAME_B(#PCDATA)>
上述DTD定义了两个元素,分别是B和NAME_B
例2-23文件内置的DTD通过外部解析参数实体复用上述A.dtd和B.dtd
DOCTYPE ROOT[<!ELEMENT ROOT (A|B)*><!ENTITY % A_attr SYSTEM "A.dtd"><!ENTITY % B_attr SYSTEM "B.dtd">%A_attr;%B_attr;]><ROOT><A><NAME_A>i am ANAME_A><B><NAME_B>i am ANAME_B>B>ROOT>
2.符号
语法格式:
2.5.1 根据XML文件产生DTD
(1)在XMLSpy中打开XML文件。
(2)选择DTD/Schema中的Generate DTD/Schema命令,弹出对话框。
(3)在对话框中默认选择转换为DTD文件,单击OK按钮,弹出另存对话框。
(4)在另存为对话框中选择正确路径,输入DTD文件名,保存。
(5)弹出对话框中添加文档类型声明引用生成的DTD。
2.5.2根据DTD文件产生XML
(1)在XMLSpy中打开DTD文件。
(2)选择DTD/Schema中的Generate Simple XML File命令,弹出对话框。
(3)在对话框中允许用户选择XML文件类型,默认选项,OK。即可生成XML文件模板。
DTD采用非XML语法描述语义约束,可实现功能:
XML文档带有自身格式描述。
企业可以有标准的DTD交换数据。
应用程序可使用标准DTD验证XML文档。
开发者使用DTD验证XML文档。
DTD自身问题:
基于正则表达式,描述能力较弱。
不支持数据类型,数据约束不准确。
约束能力不足,无法更精细的语义限制。
结构不够好,可重用性差。
在XML文件中会经常出现元素同名但是含义不同的情况,这个时候XML处理器无法区分他们,会造成含义不清。
例如 3-1 XML文件同名不同义的标记
<book><name>XML技术应用name><author><name>余可name><age>19age>author>book>
例如 3-2 利用命名空间解决同名问题
<book xmlns:bk="http://www.dlut.edu.cn/xml/book"xmlns:au="http://www.dlut.edu.cn/xml/author"><bk:name>XML技术应用bk:name><author>余可author><age>19age>book>
命名空间语法: xmlns[:prefix]=“命名空间字符串”
命名空间字符串是一个URI,可以不是真实的,只要唯一性就可以。
prefix:表示前缀名称,可以随意指定
命名空间包括两种形式
(1)没有前缀限定的命名空间
例3-3
<root xmlns="http://www.dlut.cn/xml/namespace"> <sub>abcsub> root>
!当XML文档中所有元素或者大部分位于某个命名空间下,可以使用这个方式简化编写。
(2)有前缀限定的命名空间
有前缀限定的命名空间可以使用多个,但是命名空间的别名必须不同。
例3-4 有前缀限定的命名空间
<dlut:root xmlns:dlut="http://www.dlut.cn/xml/namespace"> <dlut:sub>abcdlut:sub>
例3-5 多个命名空间声明
<dlut:root xmlns:dlut="http://www.dlut.cn/xml/dlut" xmlnsxmlns:city="http://www.dlut.edu.cn/xml/city" xmlns="http://www.dlut.edu.cn/xml/namespace"> <sub>abcsub> <city:sub2>abccity:sub2>
上述代码有三个命名空间:
分别是dlut,city和默认的别名
!在声明命名空间还有一种特殊的写法,即命名空间的别名为空,命名空间的URI也是空,例如表示默认的命名空间不在任何命名空间中,与表达含义相同。
!避免在元素中声明的命名空间相同,只是命名空间的别名不同,则不同别名指定的仍是同一个命名空间。
例3-6 相同命名空间多次声明
XML应用技术 ISBN1654
例 3-7 命名空间作用范围
<book><bk:name xmlns:bk="http://www.dlut.edu.cn/xml/book">XML应用技术bk:name><author>余可哈哈哈哈哈哈author>book>
上述在name元素中声明了命名空间,该命名空间只能在该元素及其子标记中使用
例 3-8 修改命名空间声明位置
XML应用技术 余可哈哈哈哈哈哈
修改后该命名空间位于根元素book上,该命名空间的作用范围为该文件所有文件,即该文件中所有标记都可以使用该命名空间
!如果该命名空间被子元素同别名的命名空间伏盖,则该命名空间无法作用于于子元素
例 3-9命名空间覆盖
<book xmlns:bk="http://www.dlut.edu.cn/xml/book"><bk:name >XML应用技术bk:name><author xmlns:bk="http://www.dlut.edu.cn/xml/author">余可哈哈哈哈哈哈author>book>
子元素author又声明了命名空间,采用了相同的别名,则book中声明的命名空间无法作用于author元素及其子元素
同样,author元素及其子元素如果使用命名空间的话,只能使用http://www.dlut.edu.cn/xml/author
命名空间可以作用于相应的元素,但是并不代表钙元素位于声明的命名空间中。如果要表示某元素位于某命名空间,需要要将所有
元素改为该命名空间的元素。
例 3-10 元素对命名空间的使用
<book xmlns:bk="http://www.dut.edu.cn/xml/book"><bk:name>XML教程bk:name><author>余大可哈哈哈哈author>book>
!命名空间可以作用于所有元素,但属于该命名空间的元素只有name!!!,其他元素度没有位于任何命名空间中
例 3-11 修改后元素对命名空间的使用
<book xmlns:bk="http://www.dut.edu.cn/xml/book"><bk:name>XML教程bk:name><bk:author>余大可哈哈哈哈bk:author>book>
!修改后,所有元素都属于该命名空间。
例 3-12 修改后元素对默认命名空间的使用
<book xmlns:bk="http://www.dut.edu.cn/xml/book"><name>XML教程name><author>余大可哈哈哈哈author>book>
!修改后,利用默认命名空间,使所有元素都属于该命名空间。代码繁琐度降低
例 3-13不同元素对多个命名空间的使用
<book xmnls:bk="http://www.dlut.edu.com.cn/xml/book"xmlns:au="http://www.dlut.edu.com.cn/xml/author"xmlns:bk="http://www.dlut.edu.com.cn/xml"> <bk:name>XML应用技术bk:name> <author> <au:name>余大可au:name> <age xmlns="">18age> author>book>
!XML文件声明了三个命名空间
bk:name属于book xmnls:bk="http://www.dlut.edu.com.cn/xml/book"命名空间
au:name属于book xmnls:bk="http://www.dlut.edu.com.cn/xml/author"命名空间
au:name属于book xmnls:bk="http://www.dlut.edu.com.cn/xml"命名空间
在有一次声明了默认命名空间,而且URI值为空字符串,表示元素不属于人任何命名空间
如果在属性上没有使用任何命名空间别名,则表示该属性不属于任何命名空间
注意:属性的命名空间是独立的,即无论属性所属的元素属于任何命名空间都与属性的命名空间无关。
例 3-14 属性对于命名空间的使用
<book xmlns:au="http://www.dut.edu.cn/xml/author"xmlns="http://www.dlut.edu.cn/xml"><name>XML技术name><author au:id="x001" birthday="20010529"><name>余大可name><age>19age>author>book>
!属性id属于前缀au的命名空间,但是属性birthday不属于任何命名空间
默认名称空间有效范围
(1)若为某元素声明了名称空间,则,该元素及其子元素(包括属性)均隶属于该名称空间,除非他们又受到其他名称空间的限制
(2)若一个元素声明了默认名称空间,该元素的子元素还可以声明其他默认名称空间。
(3)如果一个默认名称空间URI属性值为空则该元素不隶属于任何名称空间内。即可通过将默认名称空间赋值为空字符串,取消默认的名称空间。
DTD出现早于命名空间,可以说DTD不支持命名空间
例 3-15 DTD不支持声明了命名空间的XML文件
DOCTYPE book[<!ELEMENT book (name,author)><!ELEMENT name (#PCDATA)><!ELEMENT author (name,age)><!ELEMENT age (#PCDATA)>]><book xmlns:bk="http://www.dut.edu.cn/xml/book"xmlns:au="http://www.dlut.edu.cn/xml/author"xmln="http://www.dlut.edu.cn/xml"><name>XML技术name><author><name>余大可name><age>19age>author>book>
结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0BfIWoj3-1631502088724)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210517195145961.png)]
例3-16 使用命名空间的XML文件
DOCTYPE book[<!ELEMENT book (bk:name,author)><!ELEMENT bk:name (#PCDATA)><!ELEMENT author (au:name,age)><!ELEMENT au:name (#PCDATA)><!ELEMENT age (#PCDATA)><!ATTLIST book xmlns:bk CDATA #IMPLIEDxmlns:au CDATA #IMPLIEDxmln CDATA #IMPLIED><!ATTLIST age xmln CDATA #IMPLIED>]><book xmlns:bk="http://www.dut.edu.cn/xml/book"xmlns:au="http://www.dlut.edu.cn/xml/author"xmln="http://www.dlut.edu.cn/xml"><bk:name>XML技术bk:name><author><au:name>余大可au:name><age xmln="">19age>author>book>
!如果命名空间别名在XML中做了修改,那么DTD中对应约束也要。
习题3答案
修改XML文件,要求标记的及其子标记位于命名空间http://www.dlut.du.cn/xml/major下
及其子标记和位于命名空间http://www.dlut.du.cn/xml/student下,其余标记默认在http://www.dlut.du.cn/xml下
代码如下
DOCTYPE class [<!ELEMENT class (aa:major,students)*><!ELEMENT aa:major (aa:name)*><!ELEMENT aa:name (#PCDATA)><!ELEMENT students (bb:student)*><!ELEMENT bb:student (bb:name+,bb:age+)><!ELEMENT bb:name (#PCDATA)><!ELEMENT bb:age (#PCDATA)><!ATTLIST class xmlns:aa CDATA #REQUIREDxmlns:bb CDATA #REQUIREDxmlns CDATA #REQUIRED><!ATTLIST bb:studentsn CDATA #REQUIRED>]><class xmlns:aa="http://www.dlut.edu.cn/xml/major" xmlns:bb="http://www.dlut.edu.cn/xml/student" xmlns="http://www.dlut.edu.cn/xml"><aa:major> <aa:name>软件工程aa:name>aa:major><students> <bb:student sn="01"> <bb:name>张三bb:name> <bb:age>18bb:age> bb:student> <bb:student sn="02"> <bb:name>李四bb:name> <bb:age>120bb:age> bb:student>students>class>
2.标记的bookid属性位于命名空间http://www.dlut.edu.cn/xml/book下,标记的name属性位于命名空间http://www.dlut.edu.cn/xml/rcord下
DOCTYPE library [<!ELEMENT library (books,records)*><!ELEMENT books (book*)><!ELEMENT book (#PCDATA)><!ATTLIST book aa:bookid CDATA #REQUIRED><!ELEMENT records (item*)><!ELEMENT item (date+,person+)><!ELEMENT date (#PCDATA)><!ELEMENT person (#PCDATA)><!ATTLIST person bb:name CDATA #REQUIRED><!ATTLIST person borrowed CDATA #REQUIRED><!ATTLIST library xmlns:aa CDATA #REQUIREDxmlns:bb CDATA #REQUIRED> ]><library xmlns:aa="http://www.dlut.edu.cn/xml/book"xmlns:bb="http://www.dlut.edu.cn/xml/record"><books><book aa:bookid="b-1-1">XML详解book><book aa:bookid="b-1-2">Servlet从入门到精通book><book aa:bookid="b-1-3">JSP实例编程book>books><records><item><date>2012-08-01date><person bb:name="张三" borrowed="b-1-1 b-1-2"/>item><item><date>2012-08-02date><person bb:name="李四" borrowed="b-1-1 b-1-3"/>item>records>library>
优势
(1)更加完善,更加强大
(2)基于XML编写
(3)支持数据类型
(4)支持命名空间
第一个Schema文件 例4-1
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="school"><xs:complexType><xs:sequence><xs:element name="name" type="xs:string"/><xs:element name="major" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>xs:sequence>xs:complexType>xs:element>xs:schema>
Schema本身也是一个XML文档
(1)
(2)< xs:complexType…>——表示定义了复杂类型元素(所谓复杂元素类型是指元素包含子元素,属性,或者既包含子元素又包含属性)
(3)minOccurs=“1”——表示至少出现了一次 maxOccurs=“unbounded”——表示最多出现次数没有限制
例4-2 引用first.xsd作为语义约束的XML文件
计算机学院 软件工程 计算机科学
有两种方式引入:(1)不属于特定空间的
具体语法:
<根元素名称 xmlns :xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="XML.Schemna">
xsi:noNamespaceSchemaLocation属性值为一个Schema文件的URI。该属性值只能是一个Schema文件URI,即只能使用一个Schema文件,
如果被引入的Schema文件需要约束XML文件属于某个特定的命名空间元素,则通过xsi:schemaLocation属性引入
具体语法:
<根元素名称[ xmlns :命名空间别名=“命名空间URI"]+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="[命名空间URI Schema文件路径]+">
+xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” 这样属性值较为灵活,可以同时引入多个Schema文件
命名空间URI和Schema文件路径中间使用空格间隔
例 4-3 约束命名空间http://www.dlut.edu.cn/xml的Schema文件firsttarget.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.dlut.edu.cn/xml" xmlns:c="http://www.dlut.edu.cn/xml"><xs:element name="collage"><xs:complexType><xs:sequence><xs:element ref="c:name">xs:element><xs:element ref="c:major" minOccurs="1" maxOccurs="unbounded">xs:element>xs:sequence>xs:complexType>xs:element><xs:element name ="name" type="xs:string"/><xs:element name ="major" type="xs:string"/>xs:schema>
上述代码定义了三个元素,都属于命名空间http://www.dlut.edu.cn/xml
名称为collage,name,major 而且collage元素包含两个有序的子元素,即name,major
引用Schema文件的XML文件如下
例4-4引用Schema文件的XML文件
<s:collage xmlns:s="http://www.dlut.edu.cn/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dlut.edu.cn/xml firsttarget.xsd"><s:name>计算机学院s:name><s:major>软件工程s:major><s:major>计算机科学s:major><s:major>嵌入式s:major>s:collage>
上述代码引用firsttarget.xsd文件作为当前XML文件的语义约束
XML Schema是扩展名为".xsd"的文本文件,使用XML语法编写,基本语法结构如下
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">...[元素、属性、注释、数据类型、schema的复用]xs:schema>
XMLSchema文档是基于XML文档语法法规范编写,根标记必须为Schema xmlns:xs="http://www.w3.org/2001/XMLSchema"属性制定了XML文档实验的命名空间,这个也是W3C的命名空间
用户还可以为该元素指定两个属性
(1)elmentFormDefault:该属性值可以是qualified或unqualified,用于指定Schema中定义的局部元素是否必须使用命名空间限定,属性默认值是qualified
(2)attributeFormDefault:该属性值可以是qualified或unqualified,用于指定Schema中定义的局部元素是否必须使用命名空间限定,属性默认值是unqualified
在Scheam中定义及引用元素的语法主要包括以下三类
语法一
<xs:element name="元素名称" type="数据类型"[default="默认值"][inOccurs="最少出现的次数"][minOccurs="最多出现的次数"]/>
语法二
<xs:element name="元素名称" [default="默认值"][inOccurs="最少出现的次数"][minOccurs="最多出现的次数"]> Element typexs:element>
语法三
<xs:element ref="引用元素名称"[default="默认值"][inOccurs="最少出现的次数"][minOccurs="最多出现的次数"]/>
name:元素的名称,自己定义
type:元素的数据类型
default:元素的默认值
minOccurs:指定该元素最少出现次数,默认值为1,如果minOccurs和maxOccurs没有同时出现,则该属性值只能为1或者0
maxOccurs:指定该元素最大出现次数,默认值为1,如果指定该元素可以默认出现多次,那么属性值为"unbounded",如果minOccurs和maxOccurs同时出现,则该属性值不能为1
元素按照复杂程度可以划分:简单元素:不包含属性和子元素
复杂元素:可以包含属性和子元素
例4-5 Schema文件关于元素的定义elementDemo.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"attributeFormDefault="unqualified"><xs:element name="root"><xs:complexType><xs:sequence><xs:element name="sub1" type="xs:string" default="sub1content"/><xs:element ref="sub2" minOccurs="1" maxOccurs="unbounded"/>xs:sequence>xs:complexType>xs:element><xs:element name="sub2" type="xs:string"/>xs:schema>
元素按照定义位置还可以划分:全局元素:可以在root元素中引用该元素
局部元素:无法被其他元素引用
例如sub1就是局部元素,无法被其他元素引用
但是root和sub2是全局元素,在root元素可以引用该元素
例4-6 符合elementDemo.xsd约束的XML文件
<root xsi:noNamespaceSchemaLocation="elementDemo.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sub1>sub1contentsub1> <sub2>Stringsub2>root>
元素组是把多个元素及其约束组合在一起,使用时作为一个整体
元素组可以更好地实现复用,用户可以定义元素组
定义元素组语法:
<xs:group name ="元素组名称">包含多个元素及其约束xs:group>
引用元素组语法:
<xs:group ref="元素组名称"/>
例4-7 Schema文件关于元素组的定义和使用
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"attributeFormDefault="unqualified"><xs:element name="root"><xs:complexType><xs:sequence><xs:element name="main1"><xs:complexType><xs:group ref="subgroup"/>xs:complexType>xs:element><xs:element name="main2"><xs:complexType>xs:complexType>xs:element>xs:sequence>xs:complexType>xs:element><xs:element name="sub2" type="xs:string"/><xs:group name="subgroup"><xs:sequence><xs:element name="sub1" type="xs:string" default="sub1content"/><xs:element ref="sub2" minOccurs="1" maxOccurs="unbounded"/>xs:sequence>xs:group>xs:schema>
定义元素组的代码如下:
xs:sequence
定义属性的语法格式如下
(1)语法一:定义新属性的语法
<xs:attribute name="属性名" type="属性类型" [default="默认值"]|[fixed="固定值"]>
(2)语法二:属性的引用,引用之前必须用语法一定义
<xs:attribute ref="属性名">xs:attribute>
default:属性默认值,可选(不与fixed同时存在)
fixed:属性的固定值,若该属性存在则该属性固定(不与default同时存在)
例4-9 schema中关于属性的定义以及使用
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"attributeFormDefault="unqualified"><xs:attribute name="id" type="xs:string"/><xs:element name="root"><xs:complexType><xs:sequence><xs:element name="sub" type="xs:string"/>xs:sequence><xs:attribute name="name" type="xs:string" use="optional"/><xs:attribute ref="id" use="required"/>xs:complexType>xs:element>xs:schema>
在上述代码中,引用了三处xs:attribute来定义属性
(1)语法一使用
(2)语法二使用
例子4-10 符合上面schema文件约束的XML文件
<root id="String" name="namestr" xsi:noNamespaceSchemaLocation="attDemo.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><sub>Stringsub>root>
属性可以定义为全局属性和局部属性,在Schema元素中定义的为全局元素
在复杂类型中定义的为局部元素
属性组的语法如下
<xs:attributeGroup name="属性组名称">包含多个属性xs:attributeGroup>
例子 4-11 属性组的定义和使用
<xs:schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributedFormDefault="unqualified"><xs:element name="root"><xs:complexType><xs:sequence><xs:element name="sub1" type="xs:string" default="sub1content"/><xs:element ref="sub2" minOccurs="1" maxOccurs="unbounded"/>xs:sequence><xs:attributedGroup ref="attlist"/>xs:complexType>xs:element><xs:element name="sub2" type="xs:string"/><xs:attrubuteGroup name="attlist"><xs:attribute name="id" type="xs:string"/><xs:attribute name="language" tpe="xs:string" default="java"/>xs:attrubuteGroup>xs:schema>
符合上述的生成的XML文件
<sub1>sub1contentsub1> <sub2>Stringsub2>root>
有两种方法:(1) (2)通过标记增加注释,这种方式有更好地可读性!
对于的
说明(1)通常放在Schema组件定义开始的部分,用于说明该Schema组件的作用。内部可以出现多个
(2)该元素的注释主要供人阅读
(3)该子元素的注释主要供其他程序使用
<xs:schema xmlns:xs="http://www.w3.org.2001/XLSchema" targetNamespace="http://www.dlut.edu.cn/xml"><xs:annotaion> <xs:documentation>该标记作为XML文件根标记实验xs:documentation> xs:annotaion><xs:element name="collage"> <xs:complexType> <xs:sequnce> <xs:annotation> <xs:ducumentation>子标记namexs:ducumentation> <xs:ducumentation>子标记majorxs:ducumentation> <xs:appinfo>stringxs:appinfo> xs:annotaation> <xs:element name="name" type="xs:string"/> <xs:element name="major" type="xs:string" minOccurs="1" maxOccur="unbounded"> xs:element> xs:sequnce> xs:complexType> xs:element>xs:schema>
Schema的数据类型
按照扩展方式分为(1)内置数据类型:schema规范中已经定义好的类型,用户可以直接使用,所有内置类型除anyType之外都是简单类型,有三种类型1.任意类型 2.内置基本数据类型 3.内置扩展数据类型
(2)用户自定义数据类型:用户既可以自定义基本数据类型,也可以自定义复杂数据类型,所有的复杂数据类型都必须用户自定义得到
!!!关于elementFormDefault意思是这样的:
1、在xml中,所有引用xsd的全局的元素都必须加上命名空间的前缀
(例如xmlns:aa=http://www.example.org/classroom,全局元素都得加上aa)。
2、非全局的元素当设置为qualified时,必须添加命名空间的前缀。
3、非全局的元素当设置为unqualified时,不必也不能添加前缀。
下面是一个简单的例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gT15xRRt-1631502088726)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210522130247930.png)]
a. 当设置为unqualified时,user为全局元素(可作为根元素)必须添加前缀,非全局元素
(id,name)不必添加前缀。
b. 当设置为qualified时,所有的元素都必须添加前缀。
!!!关于attributeFormDefault
attributeFormDefault=‘unqualified’ 时表示目标命名空间下的这个属性不要带命名空间前缀.
attributeFormDefault=‘qualified’ 时表示来自目标命名空间下的属性必须要用命名空间前缀修饰.
1.任意类型
任意类型包括anyType和anysmpleType两种
anyTyp e——该元素为任意类型,和DTD中的ANY类似,此类型对元素的类型没有任何约束
anysmpleType——表示该元素为任意简单类型,定义为该类型
2.内置基本数据类型
3.内置扩展数据类型
1.自定义简单数据类型
2.自定义复杂数据类型
主要有CSS,XSL,XML数据岛,JAVAScript
CSS就是层叠样式表,也被翻译为级联样式表,对页面的布局,字体,颜色,背景等效果进行精确
具体语法格式
type:如果引用的是CSS文件,那么该属性值必须为“text/css"
href:指定被引入的外部CSS文件到的URI
例6-1
<person><name>田诗琪name><birthdate>2001-05-29birthdate><sex>女sex><high>166cmhigh>person>
被引用的CSS样式见下
name{display:block;font-size:28px;text-align:center;}
需要使用以下标记
CSS样式代码