1.XML概述
1.1XML:XML一种数据存储格式,这种数据存储格式在存储数据内容的同时,还能够保存数据之间的关系
1.2XML保存数据的方法:XML利用标签来保存数据的内容,利用标签之间的嵌套关系来保存数据之间的关系。
1.3XML的应用场景:
1.3.1利用XML跨平台的特性,用来在不同的操作系统不同的开发语言之间传输数据。如果说java是一门跨平台的语言,那XML就是跨平台的数据。
1.3.2利用XML可以保存具有关系的数据的特性,还常常被用来做为配置文件使用。,
1.4XML文件:把XML格式的数据保存到文件中,这样的文件通常起后缀名为.XML,这样的文件就叫做XML文件,XML文件是XML数据最常见的存在形式,但是,这不是XML的唯一存在形式(在内存中或在网络中也可以存在),不要把XML狭隘的理解成XML文件。
1.5XML校验:浏览器除了内置html解析引擎外还内置了XML解析器,利用浏览器打开XML格式的数据,就可以进行XML校验。
2.XML语法
2.1文档声明:一个格式良好的XML必须包含也只能包含一个文档声明,并且文档声明必须出现在XML文档第一行,其前不能有其他任何内容。
2.1.1最简单的写法:<?XML version="1.0" ?>其中的version代表当前XML所遵循的规范版本。
2.1.2使用encoding属性指定文档所使用的字符集编码:<?XML version="1.0" encoding="gb2312" ?>
注意:encoding属性指定的编码集和XML真正使用的编码应该一致,如果不一致就会有乱码问题。
encoding属性默认值为老外喜欢的iso8859-1
2.1.3使用standalone属性指定当前XML文档是否是一个独立文档:<?XML version="1.0" standalone="no" ?>,standalone默认值为yes表示是一个独立文档。
注意:很多的解析器会忽略这个属性,但是学习知识要按标准去学,所以这个属性也要掌握。
2.2元素
2.2.1元素分为开始标签和结束标签,在开始标签和结束标签之间的文本称为标签体,如果一个标签即不含标签体也不包含其他标签,那这样的标签可以把开始标签和结束标签进行合并,这样的标签叫自闭标签。
<a>xxxxx</a> <a/>
2.2.2一个元素也可以包含若干子元素,但是要注意所有的标签都要进行合理嵌套。
2.2.3一个格式良好的XML文档应该具有并且只能有一个跟标签,其他标签都应该是这个跟标签的子孙标签。
2.2.4元素的命名规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或标点符号或"_"开头。
不能以XML(或XML、或Xml 等)开头。
不能包含空格。
名称中间不能包含冒号(:)
2.3属性
一个元素可以包含多个属性,属性的值要用单引号或双引号括起来。如果属性的之中包含双引号,就要用单引号了。
属性的命名规范,参照元素的命名规范。
2.4注释
<!--这是一段注释-->
注意:注释不能出现在文档声明之前。实验:把注释写到文档声明之前,用ie打开是没问题,但是用chrome打开是报错的。这就看出来了不同的解析器有不同的处理,我们学习的时候还是按标准去学。
注释不能嵌套注释
2.5CDATA区、转义字符
都可以用来转义特殊字符。
2.5.1CDATA区<![CDATA[这是要转义的内容]]>
被CDATA区扩起来的内容,将会被浏览器当作文本来处理。
2.5.2转义字符
& --> &
< --> <
> --> >
" --> "
' --> '
2.5.3CDATA区和转义字符的区别
(1)CDATA区可以成段的进行转义,而转义字符一次只能转义一个字符
(2)CDATA区转义的字符可以保存数据本来的格式只是通知解析器按文本去处理。转义字符改变了数据本身的内容,利用其他字符替代了转义字符。请思考,如果要转义的内容是一段js程序的话,如果用转义字符合适不合适?
2.6处理指令:一段指令通知解析器以何种方式解析XML
<?XML-stylesheet type="text/css" href="1.css" ?>指定解析器使用1.css去渲染当前的XML数据
其实文档声明就是一个最常见的处理指令。
3.DTD技术
3.1DTD是一门XML约束技术,用来约束XML写法。
3.2如何在XML中引入一个DTD
3.2.1外部引入:dtd约束文件存在在一个外部文件中,我们在XML中引入该约束。
(1)本地文件引入:该dtd文件存在在本地硬盘中
<!DOCTYPE 根元素的名称 SYSTEM "文件所在的路径">
(2)公共位置文件引入:dtd约束文件存在在一个公共网络上,我们在XML引入该约束
<!DOCTYPE 根元素的名称 PUBLIC "dtd名称" "dtd所在的URL">
3.2.2在XML内部写dtd约束
在文档声明下<!DOCTYPE 根元素名称 [dtd约束的内容]>
3.3利用dtd约束XML中的元素
<!ELEMENT 元素名称 元素约束>
3.3.1元素约束
(1)存放类型
ANY:当前声明的元素可以包含任意子元素
EMPTY:当前声明的元素不能包含任何元素
(2)存放内容:利用小括号括起来的元素的名称,用来表示该元素中可以存放哪些内容
<!ELEMENT "元素名" (可以包含的元素的名称)>
小括号中的内容,可以有多个子元素的名称
如果用“,”分割这些子元素就表明这些子元素必须按指定的顺序出现
如果用“|”分割这些内容就表明这些子元素只能出现其中之一
使用“+”来表明内容可以出现一次或多次
使用“*”来表明内容可以出现零次或多次
使用“?”来表明内容可以出现零次或一次
#PCDATA表明该元素可以包含标签体
可以利用()进行组操作:
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
3.4利用dtd约束XML中的属性
<!ATTLIST 元素名
属性名 属性类型 属性约束
。。。。>
3.4.1属性类型
(1)CDATA:表明该属性的值是一个普通的文本值。
(2)ENUMERATED:表明该属性的值只能取指定范围内的其中之一
(3)ID:表明该属性值在整个文档中必须唯一,注意ID类型的属性的值必须以字母下划线开头,并且不能以数字开头,不能包含空白字符
3.4.2属性约束
(1)#REQUIRED 来表明当前这个属性是必须存在的属性
(2)#IMPLIED 来表明当前这个属性是可选的属性
(3)#FIXED "固定值" 来表明当前这个属性具有一个默认的值,可以不明确指定该属性,解析器会帮你加上,如果你硬是指定了一个其他的值,会出错。
(4)"默认值" 来表明当前属性具有一个默认的值,如果给这个属性指定一个值就用指定的值,如果不指定呢,就使用默认值。
3.5实体:可以理解为对一段内容的引用,如果有一段内容到处在被使用,可以将其设计为一个实体
3.5.1引用实体:用在XML中的实体
声明实体:<!ENTITY 实体名称 "实体内容">
引用引用实体:&实体名称;
3.5.2参数实体:用在DTD文件中的实体
声明实体:<!ENTITY % 实体名称 "实体内容">
引用参数实体: %实体名称;
三、XML编程:利用java程序去增删改查(CRUD)xml中的数据
解析思想:
dom解析
sax解析
基于这两种解析思想市面上就有了很多的解析api
sun jaxp既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式.但是这种解析方式效率低下,没什么人用.
dom4j 可以使用dom方式高效的解析xml.
pull
!!dom4j
导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导入缺少的包即可
单元测试
* 搭建环境: 在工程中引入junit包
* 测试方法:
1. 测试方法必须是公有的
2. 测试方法必须返回值是void
3. 测试方法必须加@Test
4. 测试方法没有形参
@Test : 代表测试方法
参数timeout: 指定执行方法所需最多时间(毫秒)
expected: 指定方法会出现的异常类型(用元类表示)
@Before : 执行每个测试方法之前都要执行的方法
@After : 执行每个测试方法之后都要执行的方法
@BeforeClass : 执行测试方法之前要执行的方法(静态的,只会执行一次)
@AfterClass : 执行测试方法之后要执行的方法(静态的,只会执行一次)
Dom4j解析(掌握)(第三方解析)注意:(只有标签节点才有子节点,强转为element)
* document的方法:
elements() : 拿到节点的所有子节点
elements(String) : 拿到指定名字的所有的子节点
element(String) : 拿到指定名字的子节点
* Element节点的方法:
setText() : 设置标签节点的内容
getTest() : 获得标签节点的内容
addAttibute(String name ,String value ) : 添加标签的属性
removeAttribute(String name) : 删除某个属性
* XPath: 主要作用是获取某个节点的路径 。
示例:参见帮助
四、Schema -- xml的约束技术 --- 需要掌握名称空间的概念,会读简单的Schema就可以了,不需要大家自己会写
Schema是xml的约束技术,出现的目的是为了替代dtd
本身也是一个xml,非常方便使用xml的解析引擎进行解析
对名称空间有非常好的支持
支持更多的数据类型,并且支持用户自定义数据类型
可以进行语义级别的限定,限定能力大大强于dtd
相对于dtd不支持实体
相对于dtd复杂的多,学习成本比较的高
如何在xml中引入Schema --- !!!!!名称空间的概念:全世界独一无二的名字,用来唯一的标识某个资源,通常是公司的域名,只是名字而已并不真的表示资源的位置.
五、Schema(掌握如何引入一个schema文件)
* 名称空间 : 指的是一个环境,所用的标签来自于哪个环境定义的。
* 掌握引用schema文件:
xml中引入schema约束的步骤:
1、查看schema文档,找到根元素,在xml中写出来
<?xml version="1.0" encoding="UTF-8"?>
<书架>
</书架>
2、根元素来自哪个名称空间。使用xmlns指令来声明
名称空间是在schema中定义的,就是targetNamespace的值
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.com/book">
</itcast:书架>
3、引入的名称空间根哪个xsd文件对应?
使用schemaLocation来指定:两个取值:第一个为名称空间 第二个为xsd文件的路径
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.com/book"
schemaLocation="http://www.itcast.com/book book.xsd">
</itcast:书架>
4、schemaLocation哪里来的?它来自一个标准的名称空间,直接复制黏贴即可.
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.com/book"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.com/book book.xsd">
</itcast:书架>
5、只要以上4部搞好了,对于子标签myeclipse就有提示了
~~~ Schema的语法---参照Schema的文档,了解即可