XML
1.概述
2.xml基本语法
3.xml约束和解析(重点)
在程序运行过程中,读取xml文档的数据—》解析
4.工厂模式— spring思想初探索
半成品软件,需要在此基础之上进行软件开发,提高效率
反射+动态代理+xml文档===框架
一 XML
1.1 概述
可扩展标记语言(EXtensible Markup Language),都是由W3C组织提供和维护
可扩展:标签可以自定义
作用(功能)
* 存储数据
1.作为配置文件(框架使用它)【重点】
2.作为数据的载体,在网络中传输
XML与HTML区别
1. xml文档语法严格,html文档语言松散
2. xml文档自定义,html文档是预定义
3. xml文档存储数据,html文档展示数据
1.2 快速入门
需求:编写一个user存储信息
zhangsan
18
lisi
18
书写规范
1. 页面必须有有文档声明(必须在第一行)
2. 有且仅有一个根标签
3. 标签要正确嵌套和正确的结束
4. 标签的属性必须使用引号(单双都可)
1.3 XML组成
格式:
属性:
version="1.0" 必须属性 指定xml文档的版本号 1.0(使用) or 1.1
encoding="utf-8" 可选属性,默认根据你开发环境
说明:
必须在xml文档第一行
双标签:
<开始>
单标签:
<开始/>
说明:
标签命名规则与java变量是一致,建议不要使用 xml 或 XML
属性的定义与html属性是一致
特殊:
id属性具有唯一性
实体字符(转义字符)
> 大于
< 小于
& &
CDATA区:将数据原样展示输出 (了解)
CDATA= character + data
格式:
1.4 XML约束
1)概述
作用:规定xml文档的书写规则
学习要求
1. 能够在xml中引入约束文档
2. 能够简单的读懂约束文档 (IDE开发者工具,已经实现自动提示)
约束分类
1. DTD:一种简单的约束技术
mybatis
2. Schema:一种复杂的约束技术
spring
2)DTD约束
DTD约束引入方式
1. 内部DTD约束
2. 外部DTD约束
* 本地
* 互联网(推荐)
DTD约束语法
1. 标签(元素)
* 嵌套标签
格式:
标签类型:
(#PCDATA) 字符串
EMPTY 单标签,例如:
ANY 任意类型
2. 属性
格式:
属性类型:
ID 唯一,必须以字母开头
CDATA 字符串
ENUM 枚举,例如:职务(班长|学习委员|成员) '成员'
属性说明:
#REQUIRED 必须项
#IMPLIED 可选项
#FIXED 固定值,例如:学校 CDATA #FIXED '北京大学'
张三
18
男
李四
20
男
3)Schema约束
Schema约束引入方式
1. xmlns = xml namespace --》xml命名空间
2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
固定值,声明当前文档是一个被Schema约束的一个实例
3. xsi:schemaLocation="http://www.pku.edu.cn/xml student.xsd"
通过实例,引入约束文件路径
格式:约束名 约束路径
4. xmlns="https://www.pku.edu.cn/xml"
当前xml使用缺省(默认)的Schema约束,使用此约束中的元素直接写元素名即可
例如:
5. xmlns:aa="http://java.sun.com"
当前xml使用别名为 aa 的Schema约束,使用此约束中的元素需要加上别名
例如:
二 XML解析
2.1 概述
操作xml文档,将文档中的数据读取到内存中
解析xml的方式
1. DOM:将xml文档内容一次性加载到内存,在内存中形成一颗DOM树
优点:操作方便,可以对文档进行CRUD的所有操作
缺点:占内存
2. SAX:逐行扫描文档,一边扫描一边解析
优点:不占内存
缺点:只能读取,不能增删改
常用xml解析器
技术 描述
JAXP SUN公司官方解析技术,支持DOM解析和SAX解析
PULL Android操作系统内置的解析器,sax方式的
JSOUP 是一款Java的HTML解析器(我们后面爬虫课程中讲解)
JDOM 开源的DOM方式解析技术
DOM4J JDOM增强版,也是开源的DOM方式解析技术(强烈推荐)
2.2 DOM4J解析XML
需求
通过dom4j技术来解析users.xml
如果解析的内容包含schema约束,比较麻烦
步骤分析
1. 导入jar包(今天的资料中)
dom4j-1.6.1.jar
2. 将 users.xml 复制到 src根目录下
3. 定义一个类 ParseDemo
// 1.手动加载配置文件,通过类加载器
// 2.创建DOM4J解析器的核心对象 SAXReader()
// 3.获取document文档对象
常用api方法
1. 提供获取xml文档根标签(元素)
*Element getRootElement();
2. Element对象提供方法
2.1 获取标签名的方法
String getName();
2.2 获取所有的子标签信息
List elements();
2.3 获取指定标签名的属性对象
Attribute attribute(String 属性名);
2.4 获取指定名称的子标签
Element element(String 标签名);
------------------------------------------------
2.5 直接获取指定名称的属性值
String attributeValue(String 属性名);
2.6 直接获取指定名称子标签文本内容
String elementText(String 标签名);
public static void main(String[] args) throws Exception {
// 1. 手动加载配置文件
// 1.1 获取类加载器对象
ClassLoader classLoader = ParseDemo.class.getClassLoader();
// 1.2 读取users.xml 获取该文件io流
InputStream is = classLoader.getResourceAsStream("users.xml");
// 2. 创建DOM4J核心解析器对象 simple api xml
SAXReader saxReader = new SAXReader();
// 2.1 加载 io流
Document document = saxReader.read(is);
// 3.1 获取文档的根标签(元素)
Element rootElement = document.getRootElement();
System.out.println(rootElement);
// 3.2 获取根标签名
String name = rootElement.getName();
System.out.println(name);
// 3.3 获取users下所有的子标签榆树
List elements = rootElement.elements();
System.out.println("users子标签长度:" + elements.size());
// 3.4 获取第二个标签
Element element = elements.get(1);
// 3.5 获取 第二个标签 id属性对象
Attribute idAttribute = element.attribute("id");
System.out.println(idAttribute.getValue());
// 3.6 获取name子标签
Element nameElement = element.element("name");
System.out.println(nameElement.getText());
// -----------------------
// 3.7 直接 user标签 edu属性值
System.out.println(element.attributeValue("edu"));
// 3.8 直接获取 user标签 子标签的 age文本内容
System.out.println(element.elementText("age"));
}
2.2 DOM4J整合Xpath解析XML
Xpath表达式
今天资料中提供了xpath学习API文档
DOM4J提供了解析XPath表达式方法
1. 获取一个节点(元素)
Node selectSingleNode(String xpath表达式);
2. 获取一组节点(元素)
List selectNodes(String xpath表达式);
注意:还需要导入xpath依赖包 jaxen.jar
public static void main(String[] args) throws Exception {
// 1. 手动加载配置文件
// 1.1 获取类加载器对象
ClassLoader classLoader = XpathDemo.class.getClassLoader();
// 1.2 读取users.xml 获取该文件io流
InputStream is = classLoader.getResourceAsStream("users.xml");
// 2. 创建DOM4J核心解析器对象 simple api xml
SAXReader saxReader = new SAXReader();
// 2.1 加载 io流
Document document = saxReader.read(is);
// 3.1 通过xpath表达式 获取 指定id属性值的 唯一节点
Node node = document.selectSingleNode("//f[@id='f_01']");
// 将 node节点 强转为 element元素
Element element = (Element) node;
System.out.println(element.getText());
}
三 工厂模式
动态代理:对方法进行增强
设计模式:解决一些通用的固定问题的方式
3.1 概述
之前在程序中我们一直在使用实例化对象的方式(new 对象) Person p = new Person();如果我们在代码中实例化对象有一百行乃至成千上万行 ,那么想修改成实例化其他对象的时候,带来的工作量也就不言而喻了。
在实际企业开发中我们使用的配置文件+工厂模式代替new操作的一种设计模式。
配置文件:xml、properties
步骤分析
1. 定义domain实体包 创建一些类信息
2. 定义beans.xml 配置文件存放类信息
3. 定义demo1 获取指定名称 对象
4. 定义一个BeanFactory工厂类 生产对象
// 1.手动加载 users.xml 获取io流
// 2.创建DOM4J核心解析器对象
// 3.使用xpath表达式 获取指定id属性的 element对象
// 4.获取标签体的 全限定名
// 5.通过反射 将类加载到内存,并初始化 Class.forName("")
// 6.创建对象实例 newInstance()
// 7.返回对象实例