
第03天 java基础加强
今日内容介绍
u BeanUtils概述及使用
u XML简介及约束
u XML解析
第1章 XML简介
1.1 XML基本语法
1.1.1 XML概述
XML全称为Extensible Markup Language,意思是可扩展的标记语言。
W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本!!!
标记,就是标签。例如:<a></a>
1.1.2 XML的作用
l 存放数据
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="p001">
<name>张三</name>
</person>
<person id="p002">
<name>李四</name>
</person>
</persons>
类似于java代码
class Person{
String id;
String name;
}
@Test
public void test(){
HashSet<Person> persons = new HashSet<Person>();
persons.add( new Person("p001","张三") );
persons.add( new Person("p002","李四") );
}
l 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="user1" className="com.itheima_00_Bean.User">
<property name="id" value="u001"></property>
<property name="username" value="jack"></property>
<property name="pwd" value="1234"></property>
</bean>
<bean id="user2" className=" com.itheima_00_Bean.User">
<property name="id" value="u002"></property>
<property name="username" value="rose"></property>
<property name="pwd" value="5678"></property>
</bean>
</beans>
类似于java代码
class Bean{
private String id;
private String className;
private Properties prop;
//补全set\get方法
}
@Test
public void test(){
HashSet<Bean> beans = new HashSet<Bean>()
;
Bean b1 = new Bean();
b1.setId("user1");
b1.setClassName("cn.itcast.domain.User");
Properties prop = new Properties();
prop.setProperties("id","u001");
prop.setProperties("username","jack");
prop.setProperties("pwd","1234");
b1.setProp( prop );
Bean b2 = new Bean();
b2.setId("user2");
b2.setClassName("cn.itcast.domain.User");
Properties prop = new Properties();
prop.setProperties("id","u002");
prop.setProperties("username","rose");
prop.setProperties("pwd","5678");
b2.setProp( prop );
beans.add(b1);
beans.add(b2);
}
1.2 XML基本语法--文档声明
1.2.1 XML文件要求
n 固定的文档声明
n 合格的元素和属性
n 正确的注释
n 符合要求的特殊字符编写规则
n 文件扩展名必须为xml
1.2.2 文档声明
l XML文档声明格式:
<?xml version="1.0" encoding="UTF-8"?>
- 文档声明必须为<?xml开头,以?>结束;
- 文档声明必须从文档的0行0列位置开始;
- 文档声明只有2个属性:
a) versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
b) encoding:指定当前文档的编码。可选属性,常用值是utf-8;
1.3 XML基本语法--元素
1.3.1 元素的概述
元素 element
<bean></bean>
1. 元素是XML文档中最重要的组成部分,
2. 普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>
3. 元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
4. 空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<c/>
5. 元素命名:
a) 区分大小写
b) 不能使用空格,不能使用冒号:
c) 不建议以XML、xml、Xml开头
6. 格式化良好的XML文档,必须只有一个根元素。
1.3.2 案例代码五
<?xml version="1.0" encoding="UTF-8" ?>
<人>
<男人></男人>
<女人></女人>
<女汉子></女汉子>
</人>
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean>
<property></property>
</bean>
<bean></bean>
</beans>
1.4 XML基本语法—属性
1.4.1 属性的概述
l 属性attribute
<bean id=”” className=””>
- 属性是元素的一部分,它必须出现在元素的开始标签中
- 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
- 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
- 属性名不能使用空格、冒号等特殊字符,且必须以字母开头
1.4.2 案例代码六
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="xx" className="xx">
<property name="xx" value="xx" ></property>
</bean>
<bean></bean>
</beans>
1.5 XML基本语法--注释-CDATA区
1.5.1 注释
XML的注释,以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略!
1.5.2 转义字符
l 转义字符
因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:“<”、“>”、“’”、“””、“&”。
1.5.3 CDATA
l CDATA区
<![CDATA[
任意内容
]]>
当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。
在CDATA段中出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。
在CDATA段中不能包含“]]>”,即CDATA段的结束定界符。
1.5.4 案例代码七
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 以下是配置xxx内容 -->
<!-- xxxx -->
<bean id="xx" className="xx">
<property name="xx" value="xx" >
1 < 3 > & " '
</property>
</bean>
<bean>
<![CDATA[
<bean id="xx" className="xx">
<property name="xx" value="xx" >
1 < 3 > & " '
</property>
</bean>
]]>
<![CDATA[.....]]>
</bean>
</beans>
第2章 XML约束-DTD
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
常见的xml约束:DTD、Schema
目的:通过约束文档,可以编写出xml文档(具有固定格式,规定的格式)。
2.1 XML约束--DTD概述和使用
DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
2.1.1 DTD重点要求
开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2、hibernate等。
通过提供的DTD“bean.dtd”编写XML
<?xml version="1.0" encoding="UTF-8"?>
<!--
传智播客DTD教学实例文档。
模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE beans SYSTEM "bean.dtd">
-->
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id CDATA #REQUIRED
className CDATA #REQUIRED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>
2.1.2 执行流程
l 步骤1:创建bean-dtd.xml文档,并将“bean.dtd”拷贝相同目录下。
l 步骤2:从DTD文档开始处,拷贝需要的“文档声明”
l 步骤3:完成xml内容编写
n 需要掌握基本符号
u , 表示两个元素之间关系,为顺序
u | 表示两个元素之间关系,为选中
u * 表示当前修饰出现次数,为任意
u + 表示当前修饰出现次数,为至少有一个(>=0)
u ? 表示当前修饰出现次数,为0或1
2.1.3 案例代码七
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
<bean id="b001" className="">
<property name="" value=""></property>
</bean>
<bean id="" className=""></bean>
<bean id="" className=""></bean>
<bean id="" className=""></bean>
<import resource=""></import>
<import resource=""></import>
<import resource=""></import>
<import resource=""></import>
</beans>
2.2 XML约束--DTD语法--文档声明
- 1. 内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE beans [
... //具体的语法
]>
<beans>
</beans>
- 2. 外部DTD—本地DTD,DTD文档在本地系统上,公司内部自己项目使用。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
</beans>
- 3. 外部DTD—公共DTD,DTD文档在网络上,一般都有框架提供。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
</beans>
2.3 XML约束--DTD语法--元素声明
定义元素语法:<!ELEMENT 元素名 元素描述>
元素名:自定义
元素描述包括:符号和数据类型
常见符号:? * + () | ,
常见类型:#PCDATA 表示内容是文本,不能是子标签
l 实例
2.4 XML约束--DTD语法--属性声明
2.4.1 属性的语法:(attribute)
<!ATTLIST 元素名
属性名 属性类型 约束
属性名 属性类型 约束
...
>
元素名:属性必须是给元素添加,所有必须先确定元素名
属性名:自定义
属性类型:ID、CDATA、枚举 …
ID : ID类型的属性用来标识元素的唯一性
CDATA:文本类型
枚举:(e1 | e2 | ...) 多选一
约束:
#REQUIRED:说明属性是必须的;required
#IMPLIED:说明属性是可选的;implied
2.4.2 实例
2.4.3 案例代码八
dtd约束
<?xml
version="1.0" encoding="UTF-8"?>
<!--
传智播客DTD教学实例文档。
模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE beans SYSTEM "bean.dtd">
-->
<!ELEMENT beans (bean*,import*) >
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id ID
#REQUIRED
className CDATA
#REQUIRED
type CDATA
#IMPLIED
>
<!ATTLIST property name CDATA #REQUIRED
value CDATA
#REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>
XML文件
<?xml version="1.0"
encoding="UTF-8"?>
<!DOCTYPE beans
SYSTEM "bean.dtd">
<beans>
<bean id="b001"
className="">
<property name=""
value=""></property>
<property name=""
value=""></property>
<property name=""
value=""></property>
<property name=""
value=""></property>
</bean>
<bean id="b002"
className=""></bean>
<bean id="b003"
className=""></bean>
<bean id="b004"
className=""></bean>
<import resource=""></import>
<import resource=""></import>
<import resource=""></import>
<import resource=""></import>
</beans>
第3章
XML约束—Schema
3.1 Schema概述
Schema是新的XML文档约束;
Schema要比DTD强大很多,是DTD 替代者;
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
Schema
功能更强大,数据类型更完善
Schema
支持名称空间
3.2 图解
3.3 XML约束—Schema使用
3.3.1 使用概述
与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等
通过提供“bean-schema.xsd”编写xml文档
<?xml version="1.0"
encoding="UTF-8"?>
<!--
传智播客Schema教学实例文档。
模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans
xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
-->
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/bean"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.itcast.cn/bean"
elementFormDefault="qualified">
<!-- 声明根标签 -->
<element
name="beans">
<complexType>
<choice
minOccurs="0" maxOccurs="unbounded">
<element
name="bean">
<complexType>
<sequence
minOccurs="0" maxOccurs="unbounded">
<element
name="property">
<complexType>
<attribute
name="name" use="required"></attribute>
<attribute
name="value" use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute
name="id" use="required"></attribute>
<attribute
name="className" use="required"></attribute>
</complexType>
</element>
<element
name="import">
<complexType>
<attribute
name="resource" use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>
l 案例文档中同一个“命名空间”分别使用“默认命名空间”和“显示命名空间”进行引入,所以文档中<schema>和<xsd:schema>作用一样。
3.3.2 案例实现
- 步骤1:创建bean.xml,并将“bean-schema.xsd”拷贝到同级目录
- 步骤2:从xsd文档中拷贝需要的“命名空间”
- 完成xml内容编写
<?xml
version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
<bean id="" className=""></bean>
<bean id="" className="">
<property name="" value=""/>
<property name="" value=""/>
</bean>
<import resource=""/>
<import resource=""/>
</beans>
3.3.3 案例代码九
<?xml version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
<import resource=""/>
<bean id=""
className="">
<property name=""
value=""/>
</bean>
<bean id=""
className=""></bean>
<import resource=""/>
</beans>
3.4 XML约束--Schema命名空间
3.4.1 命名空间的概述
如果一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了。
总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突。
3.4.2 关系图
3.4.3 约束文档和XML关系
当W3C提出Schema约束规范时,就提供“官方约束文档”。我们通过官方文档,必须“自定义schema
约束文档”,开发中“自定义文档”由框架编写者提供。我们提供“自定义文档”限定,编写出自己的xml文档。
3.4.4 声明命名空间
默认命名空间:<xxx xmlns=””> ,使用<标签>
显式命名空间:<xxx xmlns:别名=””> , 使用<别名:标签>
3.4.5 案例代码十
<?xml version="1.0"
encoding="UTF-8"?>
<my:beans xmlns:my="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean
bean-schema.xsd"
>
<!--
1.schema文档,必须有一个名称(namespace 命名空间)
名称要求:全球唯一。开发中常用URL (http://www.itheima.com/web/v1.0.xsd)
例如:bean-schema.xsd
targetNamespace="http://www.itcast.cn/bean"
2.引用指定的命名空间
默认引用
<beans xmlns="http://www.itcast.cn/bean">
之后使用时 <标签名>
显示引用
<beans
xmlns:my="http://www.itcast.cn/bean">
之后使用时<my:标签名>
3.必须确定xsd文档位置
<根标签
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="名称 位置"
>
官方文档,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
例如:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean
bean-schema.xsd"
-->
<my:bean className=""
id=""></my:bean>
<my:import resource=""/>
</my:beans>
命名空间高级使用
<?xml version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean
bean-schema.xsd"
>
<!--
1.一个xml文档中,只能出现一次“默认引用”
<beans xmlns="名称"
2.一个xml文档中,可以出现多次“显示引用”
<beans xmlns:a="名称a"
xmlns:b="名称b"
3.所有引用(默认+显示),都必须确定xsd文档位置
<beans xmlns="默认名称"
xmlns:a="名称a"
xmlns:b="名称b"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="默认名称 默认位置
名称a a位置
名称b b位置"
-->
</beans>
3.5 XML约束--Schema基本语法
3.5.1 案例代码十一
<?xml version="1.0"
encoding="UTF-8"?>
<!--
传智播客Schema教学实例文档。
模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/bean"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.itcast.cn/bean"
elementFormDefault="qualified">
<!-- 声明根标签
1. <element> 声明元素(标签)
2. 每一个元素必须确定类型:
complexType 复杂类型
simpleType 简单类型,一般不用,大部分都是复杂类型
3. 需要继续明确子标签出差顺序
<choice> 选择, ()
<sequence> 顺序 ,
<all> 任意
minOccurs 最少出现次数
maxOccurs 最大出现次数,unbounded 不限制(没有边)
4.<attribute>用于给元素声明属性的
use 设置属性使用, optional可选、required必选
-->
<element name="beans">
<complexType>
<choice minOccurs="0"
maxOccurs="unbounded">
<element name="bean">
<complexType>
<sequence minOccurs="0"
maxOccurs="unbounded">
<element name="property">
<complexType>
<attribute name="name"
use="optional"></attribute>
<attribute name="value"
use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute name="id"
use="required"></attribute>
<attribute name="className"
use="required"></attribute>
</complexType>
</element>
<element name="import">
<complexType>
<attribute name="resource"
use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>
第4章
XML解析
4.1 xml解析--概述和解析方式
4.1.1 xml解析概述
当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用Java基础所学习的IO知识是可以完成的,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。人们为不同问题提供不同的解析方式,并提供对应的解析器,方便开发人员操作XML。
4.1.2 解析方式和解析器
开发中比较常见的解析方式有三种,如下:
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
a)
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
b)
缺点:XML文档过大,可能出现内存溢出显现。
- SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
a)
优点:处理速度快,可以处理大文件
b)
缺点:只能读,逐行后将释放资源。
- PULL:Android内置的XML解析方式,类似SAX。(了解)
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包。
l 常见的解析开发包:
n JAXP:sun公司提供支持DOM和SAX开发包
n JDom:dom4j兄弟
n jsoup:一种处理HTML特定解析开发包
n dom4j:比较常用的解析开发包,hibernate底层采用。
4.2 xml解析--dom解析原理
XML DOM 将 整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作
DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点!
4.3 xml解析--dom4j解析实现
4.3.1 准备工作
导入jar包。
4.3.2 常用API
常用API如下:
- SaxReader对象
a)
read(…)
加载执行xml文档
- Document对象
a)
getRootElement()
获得根元素
- Element对象
a)
elements(…)
获得指定名称的所有子元素。可以不指定名称
b)
element(…)
获得指定名称第一个子元素。可以不指定名称
c)
getName()
获得当前元素的元素名
d)
attributeValue(…)
获得指定属性名的属性值
e)
elementText(…)
获得指定名称子元素的文本值
f)
getText()
获得当前元素的文本内容
4.3.3 案例代码十二
Dom4j解析类
package com.itheima_01_dom4j;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class Dom4jDemo_01 {
@Test
public void
demo01() throws DocumentException{
//1 核心类
SAXReader
saxReader = new
SAXReader();
//2 获得Document(整个xml)
Document
document = saxReader.read("beans.xml");
//3 获得根元素 beans
Element
rootElement = document.getRootElement();
//4 所有子元素 bean
List<Element>
allBeanElement = rootElement.elements("bean");
for (Element beanEle
: allBeanElement) {
//4.1 bean属性
String
id = beanEle.attributeValue("id");
String
className = beanEle.attributeValue("className");
System.out.println("bean属性:" + id + "
, " + className);
//5 元素property
List<Element>
allPropElement = beanEle.elements("property");
for (Element propEle
: allPropElement) {
String
name = propEle.attributeValue("name");
String
value = propEle.attributeValue("value");
System.out.println("property属性:" + name + " , " + value);
}
System.out.println("");
}
}
}
被解析的beans.xml
<?xml version="1.0"
encoding="UTF-8"?>
<beans>
<bean id="beanId01"
className="com.itheima.domain.User">
<property name="uid"
value="u001"></property>
<property name="username"
value="jack"></property>
</bean>
<bean id="beanId02"
className="com.itheima.domain.Book">
<property name="bid"
value="b001"></property>
<property name="title"
value="标题"></property>
</bean>
</beans>