XML的几个特点和使用场景
XML的语法规则
version: XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码
XML的标签(元素)规则
XML的其他组成
演示:
孙悟空
男
打妖精
select * from where age < 19;
什么是文档约束?
文档约束:是用来限定xml文件中的标签以及属性应该怎么写。
以此强制约束程序员必须按照文档约束的规定来编写xml文件。
文档约束的分类
XML文档约束-DTD的使用( 了解)
需求:利用DTD文档约束,约束一一个XML文件的编写。
分析:
①:编写DTD约束文档,后缀必须是.dtd
②:在需要编写的XML文件中导入该DTD约束文档
③:按照约束的规定编写XML文件的内容。
文档约束-schema
●schema可 以约束具体的数据类型,约束能力上更强大。
●schema本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨
XML的数据的作用是什么,最终需要怎么处理?
什么是XML解析
●使用程序读取XML中的数据
两种解析方式
●SAX解析
●DOM解析
使用Dom4]解析出XML文件
需求:使用Dom4]把一个XML文件的数据进行解析
分析:
①下载Dom4j框架, 官网下载。
②在项目中创建一个文件夹: lib
③将dom4j-2.1.1 .jar文件复制到lib文件夹
④在jar文件上点右键,选择Add as Library->点击0K
⑤在类中导包使用
Dom4j解析XML-得到Document对象
SAXReader类
public SAXReader()创建Dom4J的解析器对象
Document read(String url)加载XML文件成为Document对象
Document类
Element getRootElement()获得根元素对象
Dom4j解析XML的元素、属性、文本
List< Element> elements()得到当前元素下所有子元素
List< Element> elements(String name)得到当前元素下指定名字的子元素返回集合
Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
String getName()得到元素名字
String attributeValue(String name)通过属性名直接得到属性值
String elementText(子元素名)得到指定名称的子元素的文本
String getText()得到文本
package com.itzw.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.InputStream;
import java.util.List;
public class Dom4jTest01 {
@Test
public void parseXMLData() throws DocumentException {
//1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
SAXReader saxReader = new SAXReader();
//2.把XML文件加载到内存中成为一个Document文档对象
//getResourceAsStream直接去src目录下寻找文件
InputStream is = Dom4jTest01.class.getResourceAsStream("/hello_xml.xml");
Document document = saxReader.read(is);
//3.获取根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());
System.out.println("==============");
//4.获取根元素的所有子元素对象
List elements = root.elements();
for (Element element : elements) {
System.out.println(element.getName());
}
System.out.println("==============");
//5.获取根元素的某个子元素对象
Element name = root.element("name");
System.out.println(name.getName());
System.out.println("============");
//6.获取子元素文本
String name1 = root.elementText("name");
System.out.println(name1);
//这样也可以
System.out.println(name.getText());
System.out.println("=============");
//7.根据元素获取属性值
Element info = root.element("info");
Attribute id = info.attribute("id");
System.out.println(id.getName()+"-->"+id.getValue());
}
}
需求:利用Dom4J的知识,将Contact.xml文件中的联系人数据封装成List集合,其中每个元素是实体类Contact。打印输出List中的每个元素。
xml文件:
潘金莲
女
[email protected]
武松
男
[email protected]
武大狼
男
[email protected]
package com.itzw.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.InputStream;
import java.util.List;
public class Dom4jTest01 {
@Test
public void parseXMLData() throws DocumentException {
//1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
SAXReader saxReader = new SAXReader();
//2.把XML文件加载到内存中成为一个Document文档对象
//getResourceAsStream直接去src目录下寻找文件
InputStream is = Dom4jTest01.class.getResourceAsStream("/hello_xml.xml");
Document document = saxReader.read(is);
//3.获取根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());
System.out.println("==============");
//4.获取根元素的所有子元素对象
List elements = root.elements();
for (Element element : elements) {
System.out.println(element.getName());
}
System.out.println("==============");
//5.获取根元素的某个子元素对象
Element name = root.element("name");
System.out.println(name.getName());
System.out.println("============");
//6.获取子元素文本
String name1 = root.elementText("name");
System.out.println(name1);
//这样也可以
System.out.println(name.getText());
System.out.println("=============");
//7.根据元素获取属性值
Element info = root.element("info");
Attribute id = info.attribute("id");
System.out.println(id.getName()+"-->"+id.getValue());
}
}
XPath在解析XML文档方 面提供了-独树一-帜的路径思想,更加优雅,高效
XPath使用路径表达式来定位XML文档中的元素节点或属性节点。
使用Xpath检索出XML文件
需求:使用Dom4J把一个XML文件的数据进行解析
分析:
①导入jar包(dom4j和jaxen-1.1.2.jar), Xpath技术依赖Dom4j技术
②通过dom4j的SAXReader获取Document对象
③利用XPath提供的APl,结合XPath的语法完成选取XML文档元素节点进行解析操作。
④Document中与Xpath相关的API如下:
Node selectSingleNode("表达式") 获取符合表达式的唯一元素
ListselectNodes("表达式") 获取符合表达式的元素集合
演示:
package com.itzw.d2_xpath;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class XpathDemo {
/**
1.绝对路径:/根元素/子元素/子元素
*/
@Test
public void parse01() throws Exception{
//a.创建解析器对象
SAXReader saxReader = new SAXReader();
//b.把XML加载成Document文档对象
Document document =
saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
//c.检索全部的名称
List nameNodes = document.selectNodes("/contactList/contact/name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element)nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
2.全文搜索
//在全文找这个元素
*/
@Test
public void parse02() throws Exception{
//a.创建解析器对象
SAXReader saxReader = new SAXReader();
//b.把XML加载成Document文档对象
Document document =
saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
//c.检索全部的名称
//List nameNodes = document.selectNodes("//name");
//这里表示所有contact下的所有name
List nameNodes = document.selectNodes("//contact//name");
for (Node nameNode : nameNodes) {
Element nameEle = (Element)nameNode;
System.out.println(nameEle.getTextTrim());
}
}
/**
3.属性查找
//元素[@属性名称]在全文检索包含该属性的元索对象。
//元素[@属性名称=值]在全文检索包含该属性的元素且属性值为该值的元素对象。
*/
@Test
public void parse03() throws Exception{
//a.创建解析器对象
SAXReader saxReader = new SAXReader();
//b.把XML加载成Document文档对象
Document document =
saxReader.read(XpathDemo.class.getResourceAsStream("/Contacts.xml"));
//c.检索全部的名称
//List nameNodes = document.selectNodes("//name");
//这里表示所有contact下的所有name
List nodes = document.selectNodes("//@id");
for (Node node : nodes) {
Attribute attribute = (Attribute) node;
System.out.println(attribute.getName()+"-->"+attribute.getValue());
}
}
}
什么是工厂设计模式?
●之前我们创建类对象时,都是使用new对象的形式创建,在很多业务场景下也提供了不直接new的方式。
●工厂模式(Factory Pattern)是Java中最常用的设计模式之- -,这种类型的设计模式属 于创建型模式,它提供了一种获取对象的方式。
工厂设计模式的作用:
●工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入。
●可以实现类与类之间的解耦操作( 核心思想)
什么是装饰设计模式?
●创建一个新类,包装原始类,从而在新类中提升原来类的功能。
装饰设计模式的作用:
●作用:装饰模式指的是在不改变原类的基础上,动态地扩展-个类的功能。
InputStream(抽象父类)
FileInputStream(实现子类,读写性能较差)
BufferedInputStream(实现子类,装饰类,读写性能高)
①定义父类。
②定义原始类,继承父类,定义功能。
③定义装饰类,继承父类,包装原始类,增强功能! !