XML是可扩展标记语言的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用传输和存储数据
XML的几个特点和使用场景
作为软件的配置文件
就是创建一个XML类型的文件,要求文件的后缀名必须使用xml,eg:hello_world.xml
文档约束:是用来限制xml文件中的标签以及属性应该怎么写 (以此来强制约束程序员必须按照文档约束的规定来编写xml文件)
<书架>
<书>
<书名>javaEE SSM书名>
<作者>NewBoy作者>
<售价>30售价>
书>
<书>
<书名>人鬼情未了书名>
<作者>李四作者>
<售价>38售价>
书>
书架>
XML解析:实用程序读取XML中的数据
SAX解析,DOM解析
package com.itxue.d1_dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
/*
学会使用DOM4j解析XML文件中的数据
*/
public class Dom4jHelloWorld {
@Test
public void parseXMLDate() throws Exception {
// 1.创建一个Dom4j的解析器对象,代表整个dom4j框架
SAXReader saxReader = new SAXReader();
//2.把XML文件加载到内存中成为一个Document文档对象
// Document d = saxReader.read(new File("D:\\IDEA\\junit-reflect-annotation-proxy-app\\xml\\src\\student.xml"));
// 注意:getResourceAsStream中的/ 是直接去src下寻找文件
InputStream is = Dom4jHelloWorld.class.getResourceAsStream("/student.xml");
Document d = saxReader.read(is);
// 3.获取根元素对象
Element root = d.getRootElement();
String name = root.getName();
System.out.println(name);
}
}
package com.itxue.d1_dom4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
/*
学会使用DOM4j解析XML文件中的数据
*/
public class Dom4jHelloWorld {
@Test
public void parseXMLDate() throws Exception {
// 1.创建一个Dom4j的解析器对象,代表整个dom4j框架
SAXReader saxReader = new SAXReader();
//2.把XML文件加载到内存中成为一个Document文档对象
// Document d = saxReader.read(new File("D:\\IDEA\\junit-reflect-annotation-proxy-app\\xml\\src\\student.xml"));
// 注意:getResourceAsStream中的/ 是直接去src下寻找文件
InputStream is = Dom4jHelloWorld.class.getResourceAsStream("/student.xml");
Document d = saxReader.read(is);
// 3.获取根元素对象
Element root = d.getRootElement();
String name = root.getName();
System.out.println(name);
// 4.拿根元素的全部子元素
// List sonEles = root.elements();
// for (Element sonEle : sonEles) {
// System.out.println(sonEle.getName());
// 5.那某个子元素
// 默认提取第一个子元素对象
Element student = root.element("student");
System.out.println(student.elementText("name"));
System.out.println(student.elementTextTrim("name"));//去前后空格
// 获取元素的属性值
Attribute idAttr = student.attribute("id");
System.out.println(idAttr.getName() + idAttr.getValue());
// 直接提取属性值
System.out.println(student.attributeValue("id"));
System.out.println(student.attributeValue("vip"));
}
}
俄罗斯
18
女
张三
20
男
李四
33
不知道
刘依男
18
女
刘浩
20
男
孙宏恩
33
不知道
package com.itxue.d1_dom4j;
/*
*
俄罗斯
18
女
* */
public class Students {
private String name;
private int id;
private boolean vip;
private char sex;
private int age;
public Students() {
}
public Students(String name, int id, boolean vip, char sex, int age) {
this.name = name;
this.id = id;
this.vip = vip;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isVip() {
return vip;
}
public void setVip(boolean vip) {
this.vip = vip;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", id=" + id +
", vip=" + vip +
", sex=" + sex +
", age=" + age +
'}';
}
}
package com.itxue.d1_dom4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class Dom4JTest2 {
public static void main(String[] args) throws Exception {
// 1.导入框架
// 2.创建SAXReader对象
SAXReader saxReader = new SAXReader();
// 3.加载XML文件成为文档对象Document对象
Document document = saxReader.read(Dom4JTest2.class.getResourceAsStream("/student.xml"));
// 4.先拿到根元素
Element root = document.getRootElement();
// 5.提取student子元素
List studentEles = root.elements("student");
// 6.准备ArrayList集合封装联系人信息
List students = new ArrayList<>();
// 7.遍历student子元素
for (Element studentEle : studentEles) {
// 每一个子元素就是一个学生对象
Students s = new Students();
s.setId(Integer.valueOf(studentEle.attributeValue("id")));
s.setVip(Boolean.valueOf(studentEle.attributeValue("vip")));
s.setAge(Integer.valueOf(studentEle.elementText("age")));
s.setName(studentEle.elementText("name"));
s.setSex(studentEle.elementText("sex").charAt(0));
// 9.把学生对象加入到List集合中
students.add(s);
}
// 10.遍历List集合
for (Students student : students) {
System.out.println(student);
}
}
}
Xpath使用路径表达式来定位XML文档中的元素节点或属性节点
什么是工厂模式
工厂设计模式的作用:
工厂的方法可以封装对象的创建细节,,不如:为该对象进行加工和数据注入
可以实现类与类之间的解耦操作(核心思想)
创建一个新类,包装原始类,从而在新类中提升原来类的功能
装饰设计模式的作用:
装饰模式指的是在不改变原类的基础上,动态的扩展一个类的功能
父类
package com.itxue.d4_decorator_pattern;
public abstract class InputStream {
public abstract int read();
public abstract int read(byte[] buffer);
}
原始类
package com.itxue.d4_decorator_pattern;
public class FileInputStream extends InputStream{
@Override
public int read() {
System.out.println("低性能读取了一个字节a");
return 97;
}
@Override
public int read(byte[] buffer) {
buffer[0] = 97;
buffer[1] = 98;
buffer[2] = 99;
System.out.println("低性能读取了一个字节数组");
return 3;
}
}
装饰类
package com.itxue.d4_decorator_pattern;
public class BufferedInputStream extends InputStream{
private InputStream is;
public BufferedInputStream(InputStream is){
this.is = is;
}
@Override
public int read() {
System.out.println("提供8KB的缓冲区,提高读数据功能");
return is.read();
}
@Override
public int read(byte[] buffer) {
System.out.println("提供8KB的缓冲区,提高读数据功能");
return is.read(buffer);
}
}
运行
package com.itxue.d4_decorator_pattern;
public class DecoratorPattern {
public static void main(String[] args) {
InputStream is = new BufferedInputStream(new FileInputStream());
System.out.println(is.read());
System.out.println(is.read(new byte[3]));
}
}