第一节
1、XML是什么?
XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言
它是一种数据表示格式,可以用于自定义数据格式
2、XML的作用是什么
用于存储数据和传输数据
作为软件的配置文件
3、XML的组成格式要求是什么样的?
文件后缀必须是xml
文档声明必须是第一行
必须存在一个根标签,有且只能有一个
XML文件中可以定义注释信息:<!-- 注释内容 -->
标签必须成对出现,有开始,有结束标签:<name></name>
必须能够正确的嵌套
===================================================================================================
=============================================================
========================================================================================
4、什么是文档约束
5、XML的文档约束-DTD的作用和问题
可以约束XML文件的编写
不能约束具体的数据类型
6、XML的文档约束-schema的优点?
可以约束XML文件的标签内容格式,以及具体的数据类型
本身也是xml文件,格式更严谨
7、XML解析技术——Dom解析的文档对象模型是怎么样的
Document对象:整个xml文档
Element对象:标签
Attribute对象:属性
Text对象:文本内容
8、XML解析技术——Dom解析常用技术框架
Dom4j
9、Dom4j解析XML文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d1_dom4j; 2 3 import org.dom4j.Attribute; 4 import org.dom4j.Document; 5 import org.dom4j.DocumentException; 6 import org.dom4j.Element; 7 import org.dom4j.io.SAXReader; 8 import org.junit.Test; 9 10 import java.io.File; 11 import java.io.FileInputStream; 12 import java.io.InputStream; 13 import java.util.List; 14 15 /** 16 目标:学会使用dom4j解析XML文件中的数据。 17 1、导入dom4j框架。 18 2、准备一个XML文件。 19 */ 20 public class Dom4JHelloWorldDemo1 { 21 @Test 22 public void parseXMLData() throws Exception { 23 // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架 24 SAXReader saxReader = new SAXReader(); 25 26 // 2、把XML文件加载到内存中成为一个Document文档对象 27 // Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); // 需要通过模块名去定位 28 // Document document = saxReader.read(new FileInputStream("xml-app\\src\\Contacts.xml")); 29 30 // 注意: getResourceAsStream中的/是直接去src下寻找的文件 31 InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml"); 32 Document document = saxReader.read(is); 33 34 // 3、获取根元素对象 35 Element root = document.getRootElement(); 36 System.out.println(root.getName()); 37 38 // 4、拿根元素下的全部子元素对象(一级) 39 // List<Element> sonEles = root.elements(); 40 List<Element> sonEles = root.elements("contact"); 41 for (Element sonEle : sonEles) { 42 System.out.println(sonEle.getName()); 43 } 44 45 // 拿某个子元素 46 Element userEle = root.element("user"); 47 System.out.println(userEle.getName()); 48 49 // 默认提取第一个子元素对象 (Java语言。) 50 Element contact = root.element("contact"); 51 // 获取子元素文本 52 System.out.println(contact.elementText("name")); 53 // 去掉前后空格 54 System.out.println(contact.elementTextTrim("name")); 55 // 获取当前元素下的子元素对象 56 Element email = contact.element("email"); 57 System.out.println(email.getText()); 58 // 去掉前后空格 59 System.out.println(email.getTextTrim()); 60 61 // 根据元素获取属性值 62 Attribute idAttr = contact.attribute("id"); 63 System.out.println(idAttr.getName() + "-->" + idAttr.getValue()); 64 // 直接提取属性值 65 System.out.println(contact.attributeValue("id")); 66 System.out.println(contact.attributeValue("vip")); 67 68 69 70 71 } 72 }View Code
10、Dom4J的解析思想?
得到文档对象Document,从中获取元素对象和内容
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d1_dom4j; 2 3 import org.dom4j.Attribute; 4 import org.dom4j.Document; 5 import org.dom4j.DocumentException; 6 import org.dom4j.Element; 7 import org.dom4j.io.SAXReader; 8 import org.junit.Test; 9 10 import java.io.File; 11 import java.io.FileInputStream; 12 import java.io.InputStream; 13 import java.util.List; 14 15 /** 16 目标:学会使用dom4j解析XML文件中的数据。 17 1、导入dom4j框架。 18 2、准备一个XML文件。 19 */ 20 public class Dom4JHelloWorldDemo1 { 21 @Test 22 public void parseXMLData() throws Exception { 23 // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架 24 SAXReader saxReader = new SAXReader(); 25 26 // 2、把XML文件加载到内存中成为一个Document文档对象 27 // Document document = saxReader.read(new File("xml-app\\src\\Contacts.xml")); // 需要通过模块名去定位 28 // Document document = saxReader.read(new FileInputStream("xml-app\\src\\Contacts.xml")); 29 30 // 注意: getResourceAsStream中的/是直接去src下寻找的文件 31 InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml"); 32 Document document = saxReader.read(is); 33 34 // 3、获取根元素对象 35 Element root = document.getRootElement(); 36 System.out.println(root.getName()); 37 38 // 4、拿根元素下的全部子元素对象(一级) 39 // List<Element> sonEles = root.elements(); 40 List<Element> sonEles = root.elements("contact"); 41 for (Element sonEle : sonEles) { 42 System.out.println(sonEle.getName()); 43 } 44 45 // 拿某个子元素 46 Element userEle = root.element("user"); 47 System.out.println(userEle.getName()); 48 49 // 默认提取第一个子元素对象 (Java语言。) 50 Element contact = root.element("contact"); 51 // 获取子元素文本 52 System.out.println(contact.elementText("name")); 53 // 去掉前后空格 54 System.out.println(contact.elementTextTrim("name")); 55 // 获取当前元素下的子元素对象 56 Element email = contact.element("email"); 57 System.out.println(email.getText()); 58 // 去掉前后空格 59 System.out.println(email.getTextTrim()); 60 61 // 根据元素获取属性值 62 Attribute idAttr = contact.attribute("id"); 63 System.out.println(idAttr.getName() + "-->" + idAttr.getValue()); 64 // 直接提取属性值 65 System.out.println(contact.attributeValue("id")); 66 System.out.println(contact.attributeValue("vip")); 67 68 69 70 71 } 72 }View Code
11、Dom4J解析后的数据形式
通常数据会封装成Java的对象,如单个对象,或者集合对象形式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d1_dom4j; 2 /** 3 <contact id="1" vip="true"> 4 <name> 潘金莲 </name> 5 <gender>女</gender> 6 <email>[email protected]</email> 7 </contact> 8 */ 9 public class Contact { 10 private String name; 11 private int id; 12 private boolean vip; 13 private char gender; 14 private String email; 15 16 public Contact() { 17 } 18 19 public Contact(String name, int id, boolean vip, char gendar, String email) { 20 this.name = name; 21 this.id = id; 22 this.vip = vip; 23 this.gender = gendar; 24 this.email = email; 25 } 26 27 public String getName() { 28 return name; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 public int getId() { 36 return id; 37 } 38 39 public void setId(int id) { 40 this.id = id; 41 } 42 43 public boolean isVip() { 44 return vip; 45 } 46 47 public void setVip(boolean vip) { 48 this.vip = vip; 49 } 50 51 public char getGender() { 52 return gender; 53 } 54 55 public void setGender(char gender) { 56 this.gender = gender; 57 } 58 59 public String getEmail() { 60 return email; 61 } 62 63 public void setEmail(String email) { 64 this.email = email; 65 } 66 67 @Override 68 public String toString() { 69 return "Contact{" + 70 "name='" + name + '\'' + 71 ", id=" + id + 72 ", vip=" + vip + 73 ", gendar=" + gender + 74 ", email='" + email + '\'' + 75 '}'; 76 } 77 }Contact
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d1_dom4j; 2 3 import org.dom4j.Document; 4 import org.dom4j.Element; 5 import org.dom4j.io.SAXReader; 6 import org.junit.Test; 7 8 import java.util.ArrayList; 9 import java.util.List; 10 11 public class Dom4JTest2 { 12 @Test 13 public void parseToList() throws Exception { 14 // 需求:解析XML中的数据成为一个List集合对象。 15 // 1、导入框架(做过) 16 // 2、创建SaxReader对象 17 SAXReader saxReader = new SAXReader(); 18 // 3、加载XML文件成为文档对象Document对象。 19 Document document = 20 saxReader.read(Dom4JTest2.class.getResourceAsStream("/Contacts.xml")); 21 // 4、先拿根元素 22 Element root = document.getRootElement(); 23 // 5、提取contact子元素 24 List<Element> contactEles = root.elements("contact"); 25 // 6、准备一个ArrayList集合封装联系人信息 26 List<Contact> contacts = new ArrayList<>(); 27 // 7、遍历Contact子元素 28 for (Element contactEle : contactEles) { 29 // 8、每个子元素都是一个联系人对象 30 Contact contact = new Contact(); 31 contact.setId(Integer.valueOf(contactEle.attributeValue("id"))); 32 contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip"))); 33 contact.setName(contactEle.elementTextTrim("name")); 34 contact.setGender(contactEle.elementTextTrim("gender").charAt(0)); 35 contact.setEmail(contactEle.elementText("email")); 36 // 9、把联系人对象数据加入到List集合 37 contacts.add(contact); 38 } 39 // 10、遍历List集合 40 for (Contact contact : contacts) { 41 System.out.println(contact); 42 } 43 } 44 }Dom4JTest2
12、如果需要从XML文件中检索需要的某个信息(如name)怎么解决
Dom4J需要进行文件的全部解析,然后再寻找数据
Xpath技术更加适合做信息检索
13、Xpath作用,四大类
检索XML文件中的信息
绝对路径:/根元素/子元素/孙元素
相对路径:./子元素/孙元素
全文检索://contact
属性查找://@属性名、//元素[@属性名]、//元素//[@属性名=‘值’]
===================================================================
================================================================================================
============================
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d2_xpath; 2 import org.dom4j.Attribute; 3 import org.dom4j.Document; 4 import org.dom4j.Element; 5 import org.dom4j.Node; 6 import org.dom4j.io.SAXReader; 7 import org.junit.Test; 8 9 import java.util.List; 10 11 /** 12 目标:XPath检索XML中的信息啊。(了解) 13 14 引入: 15 Dom4J可以用于解析整个XML的数据。 16 但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术) 17 Dom4J用于解析数据,Xpath用于检索数据。 18 XPath使用步骤: 19 1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!) 20 2.导入XPath独有的框架包。jaxen-1.1.2.jar 21 XPath常用API: 22 List<Node> selectNodes(String var1):检索出一批节点集合。 23 Node selectSingleNode(String var1):检索出一个节点返回。 24 XPath提供的四种检索数据的写法: 25 1.绝对路径。 26 2.相对路径。 27 3.全文搜索。 28 4.属性查找。 29 小结: 30 1.绝对路径: /根元素/子元素/子元素。 31 2.相对路径: ./子元素/子元素。 (.代表了当前元素) 32 3.全文搜索: 33 //元素 在全文找这个元素 34 //元素1/元素2 在全文找元素1下面的一级元素2 35 //元素1//元素2 在全文找元素1下面的全部元素2 36 4.属性查找。 37 //@属性名称 在全文检索属性对象。 38 //元素[@属性名称] 在全文检索包含该属性的元素对象。 39 //元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。 40 */ 41 public class XPathDemo { 42 /** 43 1.绝对路径: /根元素/子元素/子元素。 44 */ 45 @Test 46 public void parse01() throws Exception { 47 // a、创建解析器对象 48 SAXReader saxReader = new SAXReader(); 49 // b、把XML加载成Document文档对象 50 Document document = 51 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml")); 52 // c、检索全部的名称 53 List<Node> nameNodes = document.selectNodes("/contactList/contact/name"); 54 for (Node nameNode : nameNodes) { 55 Element nameEle = (Element) nameNode; 56 System.out.println(nameEle.getTextTrim()); 57 } 58 } 59 60 /** 61 2.相对路径: ./子元素/子元素。 (.代表了当前元素) 62 */ 63 @Test 64 public void parse02() throws Exception { 65 // a、创建解析器对象 66 SAXReader saxReader = new SAXReader(); 67 // b、把XML加载成Document文档对象 68 Document document = 69 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml")); 70 Element root = document.getRootElement(); 71 // c、检索全部的名称 72 List<Node> nameNodes = root.selectNodes("./contact/name"); 73 for (Node nameNode : nameNodes) { 74 Element nameEle = (Element) nameNode; 75 System.out.println(nameEle.getTextTrim()); 76 } 77 } 78 79 /** 80 3.全文搜索: 81 //元素 在全文找这个元素 82 //元素1/元素2 在全文找元素1下面的一级元素2 83 //元素1//元素2 在全文找元素1下面的全部元素2 84 */ 85 @Test 86 public void parse03() throws Exception { 87 // a、创建解析器对象 88 SAXReader saxReader = new SAXReader(); 89 // b、把XML加载成Document文档对象 90 Document document = 91 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml")); 92 // c、检索数据 93 //List<Node> nameNodes = document.selectNodes("//name"); 94 // List<Node> nameNodes = document.selectNodes("//contact/name"); 95 List<Node> nameNodes = document.selectNodes("//contact//name"); 96 for (Node nameNode : nameNodes) { 97 Element nameEle = (Element) nameNode; 98 System.out.println(nameEle.getTextTrim()); 99 } 100 } 101 102 /** 103 4.属性查找。 104 //@属性名称 在全文检索属性对象。 105 //元素[@属性名称] 在全文检索包含该属性的元素对象。 106 //元素[@属性名称=值] 在全文检索包含该属性的元素且属性值为该值的元素对象。 107 */ 108 @Test 109 public void parse04() throws Exception { 110 // a、创建解析器对象 111 SAXReader saxReader = new SAXReader(); 112 // b、把XML加载成Document文档对象 113 Document document = 114 saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml")); 115 // c、检索数据 116 List<Node> nodes = document.selectNodes("//@id"); 117 for (Node node : nodes) { 118 Attribute attr = (Attribute) node; 119 System.out.println(attr.getName() + "===>" + attr.getValue()); 120 } 121 122 // 查询name元素(包含id属性的) 123 // Node node = document.selectSingleNode("//name[@id]"); 124 Node node = document.selectSingleNode("//name[@id=888]"); 125 Element ele = (Element) node; 126 System.out.println(ele.getTextTrim()); 127 } 128 }XPathDemo
第二节 设计模式--工厂设计模式
1、工厂设计模式的作用
对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入
可以实现类与类之间的解耦操作(核心思想)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d3_factory_pattern; 2 3 public abstract class Computer { 4 private String name; 5 private double price; 6 7 public abstract void start(); 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) { 14 this.name = name; 15 } 16 17 public double getPrice() { 18 return price; 19 } 20 21 public void setPrice(double price) { 22 this.price = price; 23 } 24 }Computer
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d3_factory_pattern; 2 3 public class Huawei extends Computer{ 4 @Override 5 public void start() { 6 System.out.println(getName() + "开机了,展示了华为的菊花图标~~~~"); 7 } 8 }Huawei
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d3_factory_pattern; 2 3 public class Mac extends Computer{ 4 @Override 5 public void start() { 6 System.out.println(getName() + "以非常优雅的方法启动了,展示了一个苹果logo"); 7 } 8 }Mac
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d3_factory_pattern; 2 3 public class FactoryPattern { 4 /** 5 定义一个方法,创建对象返回 6 */ 7 public static Computer createComputer(String info){ 8 switch (info){ 9 case "huawei": 10 Computer c = new Huawei(); 11 c.setName("huawei pro 16"); 12 c.setPrice(5999); 13 return c; 14 case "mac": 15 Computer c2 = new Mac(); 16 c2.setName("MacBook pro"); 17 c2.setPrice(11999); 18 return c2; 19 default: 20 return null; 21 } 22 } 23 }FactoryPattern
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d3_factory_pattern; 2 3 4 /** 5 目标:工厂模式。 6 7 什么是工厂设计模式? 8 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。 9 这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。 10 之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外, 11 工厂模式也可以创建对象。 12 13 工厂设计模式的作用: 14 1.对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。 15 2.可以实现类与类之间的解耦操作(核心思想,重点) 16 17 小结: 18 工厂模式的思想是提供一个工厂方法返回对象! 19 */ 20 public class FactoryDemo { 21 public static void main(String[] args) { 22 Computer c1 = FactoryPattern.createComputer("huawei"); 23 c1.start(); 24 25 Computer c2 = FactoryPattern.createComputer("mac"); 26 c2.start(); 27 } 28 }FactoryDemo
第三节 设计模式--装饰设计模式
1、装饰设计模式的作用
装饰模式指的是在不改变原类的基础上,动态的扩展一个类的功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d4_decorator_pattern; 2 3 /** 4 共同父类 5 */ 6 public abstract class InputStream { 7 public abstract int read(); 8 public abstract int read(byte[] buffer); 9 }InputStream
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d4_decorator_pattern; 2 3 import java.util.Arrays; 4 5 /** 6 原始类 7 */ 8 public class FileInputStream extends InputStream{ 9 @Override 10 public int read() { 11 System.out.println("低性能的方式读取了一个字节a"); 12 return 97; 13 } 14 15 @Override 16 public int read(byte[] buffer) { 17 buffer[0] = 97; 18 buffer[1] = 98; 19 buffer[2] = 99; 20 System.out.println("低性能的方式读取了一个字节数组:" + Arrays.toString(buffer)); 21 return 3; 22 } 23 }FileInputStream
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d4_decorator_pattern; 2 3 /** 4 装饰类:继承InputStream 拓展原始类的功能 5 */ 6 public class BufferedInputStream extends InputStream{ 7 private InputStream is; 8 public BufferedInputStream(InputStream is){ 9 this.is = is; 10 } 11 @Override 12 public int read() { 13 System.out.println("提供8KB的缓冲区,提高读数据性能~~~~"); 14 return is.read(); 15 } 16 17 @Override 18 public int read(byte[] buffer) { 19 System.out.println("提供8KB的缓冲区,提高读数据性能~~~~"); 20 return is.read(buffer); 21 } 22 }BufferedInputStream
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.itheima.d4_decorator_pattern; 2 3 /** 4 装饰模式 5 6 定义父类:InputStream 7 定义实现类:FileInputStream 继续父类 定义功能 8 定义装饰实现类:BufferedInputStream 继承父类 定义功能 包装原始类,增强功能。 9 */ 10 public class DecoratorPattern { 11 public static void main(String[] args) { 12 InputStream is = new BufferedInputStream(new FileInputStream()); 13 System.out.println(is.read()); 14 System.out.println(is.read(new byte[3])); 15 } 16 }View Code 标签:XML,--,元素,contact,println,import,设计模式,public,out From: https://www.cnblogs.com/Flower--Dance/p/16708240.html