1.XML
概念:是一种数据格式
组成要求:
-
组成格式要求
-
后缀是xml
-
文档声明必须在第一行
-
<?xml version="1.0" encoding="UTF-8" ?>
-
-
有且只有一个根标签
-
可以定义注释
-
标签必须成对出现
-
必须能够正确嵌套
-
-
<?xml version="1.0" encoding="UTF-8" ?> <!--这是注释--> <Student> <name>张三</name> <age>18</age> <adr> <code>10101</code> <name>花果山</name> </adr> <sql> <![CDATA[ ]]> </sql> </Student>
2. XML文档的约束
- DTD
- XSD
3.Dom常见的解析对象
-
Document对象:整个xml文档
-
Element对象
-
Attribute对象
-
Text对象
-
1.dom4j解析XML文件(重点)
@Test
public void parseXMLtoList() throws Exception {
//1.创建SAXReader解析对象,代表Dom4j框架
SAXReader saxReader = new SAXReader();
//2.推荐方案:读取字节输入流(默认认为/是直接去src下找的)
Document document = saxReader.read(d3_dom4j快速入门.class.getResourceAsStream("demo1.xml"));
//3.提取根元素
Element root = document.getRootElement();
//4.提取全部一级子元素
List<Element> elements = root.elements();
//5.定义一个ArrayList集合准备存储3个联系人对象信息
List<Student> list = new ArrayList<>();
//6.遍历每个元素
for (Element element : elements) {
Student student = new Student();
student.setId(Integer.valueOf(element.attributeValue("id")));
student.setVip(Boolean.valueOf(element.attributeValue("vip")));
student.setName(element.elementText("name"));
student.setAge(parseInt(element.elementTextTrim("age")));
student.setSex(element.elementText("sex").charAt(0));
student.setEmile(element.elementText("emile"));
list.add(student);
}
for (Student student : list) {
System.out.println(student);
}
}
2.使用Xpath检索出XML文件(重点)
1.绝对路径:
//1.绝对路径:根元素/子元素/子元素
@Test
public void parse01() throws Exception {
//a.创建解析器
SAXReader saxReader = new SAXReader();
//b.把XML文件加载成Document文档对象
Document document =
saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
//c.直接检索
List<Node> nodes = document.selectNodes("/students/student/name");
for (Node node : nodes) {
Element element = (Element) node;
System.out.println(element.getTextTrim());
}
2. 相对路径
//2.相对路径:./子元素/子元素(.代表了当前元素)
//a.创建解析器
SAXReader saxReader = new SAXReader();
//b.把XML文件加载成Document文档对象
Document document =
saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
Element root = document.getRootElement();
//c.直接检索
List<Node> nodes = root.selectNodes("./student/name");
for (Node node : nodes) {
Element element = (Element) node;
System.out.println(element.getTextTrim());
}
3.全文检索
/**
* 全文检索:
* //元素: 在全文中找这个元素
* //元素1/元素2 在全文中找到元素1下面的一级元素2
* //元素1//元素2 在全文找元素1下面的全部元素2
*/
//a.创建解析器
SAXReader saxReader = new SAXReader();
//b.把XML文件加载成Document文档对象
Document document =
saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
//c.直接检索
List<Node> nodes = document.selectNodes("//name");
for (Node node : nodes) {
Element element = (Element) node;
System.out.println(element.getTextTrim());
}
4.属性查找
/**
* 属性查找
* //@属性名称 在全文中检索属性对象
* //元素[@属性名称] 在全文中检索包含该属性的元素对象
* //元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象
*/
//a.创建解析器
SAXReader saxReader = new SAXReader();
//b.把XML文件加载成Document文档对象
Document document =
saxReader.read(d4_Xpath解析XML文件.class.getResourceAsStream("demo1.xml"));
//c.直接检索
List<Node> nodes = document.selectNodes("//@id");
for (Node node : nodes) {
Attribute attribute = (Attribute) node;
System.out.println(attribute.getName() + "=" + attribute.getValue());
}
//检索元素的
List<Node> nodes1 = document.selectNodes("//student[@id]");
for (Node node : nodes1) {
Element element = (Element) node;
System.out.println(element.elementTextTrim("name"));
}
//检索元素
Node nodes3 = document.selectSingleNode("//student[@id='1']");
Element ele = (Element)nodes3;
System.out.println(ele.elementTextTrim("name"));
4.工厂设计模式
-
工厂设计模式是java最常用的设计模式之一,这种类型的设计模式属于创建型模式,他提供了一种获取对象的方式
-
作用
-
工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入
-
可以实现类与类之间的解耦思想(核心)
-
5.装饰设计模式
-
创建一个新类,包装原始类,从而在新类中提升原始类的功能
-
作用
-
装饰模式指的是在不改变原类的基础上,动态的扩展一个类的功能
-
//1.原始字节输入流
public class FileInputStream extends InputStream{
@Override
public int read() {
return 97;
}
@Override
public int read(byte[] buffer) {
buffer[0]='a';
buffer[1]='b';
return 2;
}
@Override
public void close() throws IOException {
System.out.println("低级字节输入流被关闭~~");
}
}
//2.装饰类增强原始字节输入流功能
public class BufferInputStream extends InputStream {
private InputStream is;
public BufferInputStream(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);
}
@Override
public void close() throws IOException {
is.close();
}
}
//3.父类
public abstract class InputStream implements Closeable {
public abstract int read();
public abstract int read(byte[] buffer);
}
//4.实现
public static void main(String[] args) {
//1.创建一个高级的缓冲字节输入流管道,包装低级的文件字节输入流管道
BufferInputStream bis=new BufferInputStream(new FileInputStream());
int bt= bis.read();
System.out.println((char)bt);
byte[] buffer=new byte[1024];
int lens=bis.read(buffer);
String re=new String(buffer,0,lens);
System.out.println(re);
}