java基础-day26

时间:2023-03-09 19:09:53
java基础-day26

第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"?>

  1. 文档声明必须为<?xml开头,以?>结束;
  2. 文档声明必须从文档的0行0列位置开始;
  3. 文档声明只有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=””>

  1. 属性是元素的一部分,它必须出现在元素的开始标签中
  2. 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
  3. 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
  4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头

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 &lt; 3  &gt;  &amp;  &quot;  &apos;

</property>

</bean>

<bean>

<![CDATA[

<bean id="xx" className="xx">

<property name="xx" value="xx" >

1 &lt; 3  &gt;  &amp;  &quot;  &apos;

</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. 1.     内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE beans [

... //具体的语法

]>

<beans>

</beans>

  1. 2.     外部DTD—本地DTD,DTD文档在本地系统上,公司内部自己项目使用。

<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE beans SYSTEM "bean.dtd">

<beans>

</beans>

  1. 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. 步骤1:创建bean.xml,并将“bean-schema.xsd”拷贝到同级目录
  1. 步骤2:从xsd文档中拷贝需要的“命名空间”
  1. 完成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 解析方式和解析器

开发中比较常见的解析方式有三种,如下:

  1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。

a)    
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

b)    
缺点:XML文档过大,可能出现内存溢出显现。

  1. SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)

a)    
优点:处理速度快,可以处理大文件

b)    
缺点:只能读,逐行后将释放资源。

  1. 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如下:

  1. SaxReader对象

a)    
read(…)
加载执行xml文档

  1. Document对象

a)    
getRootElement()
获得根元素

  1. 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>