Android学习笔记整理(2)--XML篇之XML约束技术
1.什么是XML约束?
在XML技术里,可以编写一个文档来约束一个XML文档的写法,这称之为XML约束。
2.XML约束的作用
约束XML文档的写法,对XML进行校验
3.常用的XML约束技术
DTD约束:
3.1在XML中引入dtd的两种引用
1)外部引入
可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd而文件保存时必须用utf-8编码保存.
再在xml文件中使用
<!DOCTYPE 根元素名称 SYSTEM 文件的位置>
如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置
<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明dtd的名字和dtd所在网络位置URL地 址
(2)内部引入
直接在xml中书写dtd
<!DOCTYPE 根元素名称[
dtd约束....
]>
举个约束的例子吧
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Android</书名>
<作者>张三</作者>
<售价>39.00元</售价>
</书>
<书>
<书名>JavaScript</书名>;
<作者>李四</作者>
<售价>28.00元</售价>
</书>
</书架>
book.dtd
<!ELEMENT 书架(书+)>
<!ELEMENT 书(书名,作者,售价)>
<!ELEMENT 书名(#PCDATA)>
<!ELEMENT 作者(#PCDATA)>
<!ELEMENT 售价(#PCDATA)>
3.2dtd校验
我们写好了约束,自然会有校验,在一些工具中eclipse就会有自动校验功能,但是在浏览器中默认是没有校 验的,那么在浏览器中我们就会解析器校验。
默认情况下IE浏览器内置的XML解析器的约束校验器是被关闭的,所以我们需要使用JavaScriot手动解析器对 象,打开约束校验功能,对XML进行约束校验
<script>
var xmldoc=new ActiveXObject("Microsoft.XMLDOM");//利用javascript创建一个浏览器内置的xml解析器
xmldoc.validataOnParse=true;//将xml解析器的dtd校验打开
valdoc.load("book.xml");//装载xml文档
var reason=xmldoc.parseError.reason;//获取错误信息
var ling=xmldoc.parseError.line;//获取错误信息
</script>
3.3dtd语法
(1)元素
<!ELEMENT 元素名称 元素约束>
元素约束:
存放类型:ANY/EMPTY
元素约束:子元素的列表,将可以包含的子元素用小括号括起来
子元素之间可以使用逗号进行分隔,表名子元素必须按照顺序出现
子元素之间可以使用竖线进行分隔,表面子元素出现其中之一
#PCDATA表明包含标签体
+ 表示一次或多次
* 0次或多次
? 0次或一次
多个条件可使用小括号进行组的操作
例如:<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)*|COMMENT)>
MYFILE元素中可以出现(TITLE*,AUTHOR?,EMAIL)出现0次或多次或者COMMENT一次,
在(TITLE*,AUTHOR?,EMAIL)中按顺序TITLE出现0次或多次,AUTHOR出现0次或一次,EMAIL出现
一次
(2)属性
<!ATTLIST 元素名
属性名 属性类型 属性约束
属性名2 属性类型 属性约束
......
>
属性类型:
CDATA:表示属性的值是一个普通字符串
ENUMERATED : 属性的值是一个枚举列表中的值
ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字
母,下划线开始,不能使用数字,不能出现空白字符
属性约束:
#REQUIRED --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错
#IMPLIED --- 表明当前属性是一个可选的属性,可以有也可以没有
#FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定
值为值.如果这样的属性指定了一个不是固定值的值则校验报错
'默认值' --- 表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默
认值
3)ENTITY(实体)
<!ENTITY >,就是对一大段内容的引用,可以简化代码的复用
引用实体:在xml中引用的实体叫做引用实体
<!ENTITY 实体名称 “实体内容” >
&实体名称;
参数实体:在dtd中引用的实体叫做参数实体
<!ENTITY % 实体名称 "实体内容">
%实体名称;
Schema约束技术
(1)用来克服DTD的局限性
(2)与DTD中的区别
对名称空间有非常好的支持
支持更多的数据类型,并且支持用户自定义数据类型
可以进行语义级别的限定,限定能力大大强于dtd
相对于dtd不支持实体
相对于dtd复杂的多,学习成本比较的高
(3)如何在xml中引入Schema
名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真
的表示资源的位置.
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. itcast.cn"
elementFormDefault="qualified">
<xs:schema>
案例:
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast=“www.itcast.cn”
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“www.itcast.cn book.xsd">
<itcast:书>
<itcast:书名>JavaScript</itcast:书名>
<itcast:作者>张三</itcast:作者>
<itcast:售价>28.00元</itcast:售价>
</itcast:书>
</itcast:书架>
(4)Schema语法
基本需要我们弄清楚名称空间,语法就好了解,语法知识可以参考W3C文档。
上一篇: Runtime学习笔记整理
下一篇: ServiceLoader用法