Java XML
Java XML 解析器
什么是XML解析?
解析XML是指将通过XML文档访问数据或修改数据的一个操作或方法。
Java库中提供了两种XML解析器:
1、像文档对象模型(Document Object Model,DOM)解析器这的树型解析器(tree parse),它们将读入的XML文档转换 成树结构。
2、像XML简单API(Simple API for XML,SAX)解析器这样的流机制解析器(streaming parser),它们在读入XML文档时生 成相应的事件。
XML解析器是什么?
XML解析器提供方法来访问或修改XML文档中的数据。 Java提供了多种选择来解析XML文档。以下是各种类型解析器其通常用于解析XML文档。
Dom解析器 - 解析通过加载该文件的全部内容,并创建其完整分级树中存储的文件。
SAX解析器 -解析基于事件触发器的文档。不完整(部分)的文件加载到存储器中。
JDOM解析器 - 解析以类似的方式,以DOM解析器但更简单的方法的文档。
StAX解析器 -解析以类似的方式,以SAX解析器但在更高效的方式的文档。
XPath解析器 - 解析基于表达式XML并广泛选择使用XSLT。
DOM4J解析器 - **Java库来解析XML,XPath和使用Java集合框架XSLT,为DOM,SAX和JAXP的支持。
Java DOM4J解析器
DOM4J是一个开源的,基于Java的库来解析XML文档,它具有高度的灵活性,高性能和内存效率的API。这是java的优化,使用Java集合像列表和数组。它可以使用DOM,SAX,XPath和XSLT。它解析大型XML文档时具有极低的内存占用。
环境设置
为了使用DOM4J解析器,应该 dom4j-1.6.1.jar 和 jaxen.jar 在应用程序的类路径中。下载 dom4j-1.6.1.zip.
什么情况下使用?
应该考虑使用DOM4J解析器的时候: 1、需要知道很多关于文档的结构 2、需要将文档的部分围绕(例如,可能需要某些元素进行排序) 3、需要使用的文件中的信息超过一次 4、你是一个Java开发人员,并希望利用XML的Java的优化解析。
会得到什么?
当解析一个DOM4J解析XML文档,可以灵活地得到一个树形结构,其中包含所有文档的元素,而不会影响应用程序的内存占用。DOM4J提供了多种可用于检查的情况下文档内容和结构的实用功能是良好的结构,其结构是公知的。 DOM4J使用XPath表达式来浏览XML文档。
优势
DOM4J使Java开发的灵活性和XML解析代码易于维护。它是轻量级的,快速的API。
DOM4J 类 DOM4J定义了几个Java类。以下是最常见的类:
使用dom4j解析xml的大致步骤
1.创建SAXReader
2.使用SAXReader读取xml文档并且生成Document对象。 这一步也是dom解析耗资源的地方,因为首先要先将文档所有数据读取完毕,并且以一个Document对象的形式保存在内存当中
3.通过Document对象获取根元素
4.按照xml文档的结构从根元素开始逐级遍历xml文档数据的目的
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo02 {
public static void main(String[] args) throws Exception {
// 获取xml路径
String path = "./dir/beans.xml";
// 创建输入流对象
InputStream in = new FileInputStream(path);
// 创建SAXReader对象
SAXReader reader = new SAXReader();
// 生成dom对象
Document dom = reader.read(in);
// 获取根节点对象
Element rootElement = dom.getRootElement();
/*
* Document提供了获取根元素的方法:Element getRootElement()
* 而element的每一个实例用于表示当前xml文件的一个元素(一对标签),它提供了获取
* 其元素相关的方法:
* 获取当前标签的名字:String getName()
* 获取当前标签中间的文本:String getText()
* 获取当前标签下指定名字的子标签:Element element(String name)
* 获取当前标签下的所有子标签:List elements()
* 获取当前标签下指定名字的子标签:List elements(String name)
* 获取当前标签下指定名字标签的属性:Attribute attribute(String name)
* Attribute的每一个实例表示一个属性,它有两个方法:
* 获取属性名:String getName()
* 获取属性值:String getValue()
*/
// 获取根节点的标签名字
System.out.println("根标签:" + rootElement.getName());
// 获取指定名字的标签
List<Element> student = rootElement.elements("student");
for (Element element : student) {
// 获取标签名字
System.out.println(element.getName());
// 获取标签属性
Attribute id = element.attribute("id");
// 获取属性值
System.out.println(id.getName() + ": " + id.getValue());
}
System.out.println("****************************************************************");
// 定义容器存放Student对象
List<Student> list = new ArrayList<>();
// 获取跟标签下的所有子标签
List<Element> elements = rootElement.elements();
for (Element element : elements) {
// 实例化student对象
Student stu = new Student();
// 获取所有子标签的名字
System.out.println("子标签名字:" + element.getName());
// 获取子标签下的所有标签元素
List<Element> elements1 = element.elements();
for (Element element1 : elements1) {
String tagName = element1.getName();
// 获取所有子孙标签的名字
System.out.println("\t\t子孙标签名字:" + tagName);
// 获取标签文本内容
String text = element1.getTextTrim();
System.out.println("\t\t\t" + element1.getName() + "的文本内容为:" + text);
// 为student属性赋值
switch (tagName) {
case "name":
stu.setName(text);
break;
case "sex":
stu.setSex(text);
break;
case "age":
stu.setAge(Integer.parseInt(text));
break;
}
}
// i将student信息存放到集合当中
list.add(stu);
}
System.out.println(list);
}
}
生成xml文件其大致步骤为:
1.创建一个Document对象,表示一个空白文档
2.向Document中添加根元素
3.按照xml文档结构从根标签开始逐级添加子标签以及对应的数据
4.创建XmlWrite
5.使用XmlWrite写出Document,生成文档
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
public class Demo03 {
public static void main(String[] args) throws Exception {
// 准备需要写入的数据
List<Student> list = new ArrayList<Student>();
list.add(new Student("大锤", "北京", 26));
list.add(new Student("张三丰", "北京", 140));
list.add(new Student("金轮法王", "西藏", 59));
list.add(new Student("黄蓉", "杭州", 26));
list.add(new Student("郭靖", "蒙古", 32));
// 1.创建一个Document对象,表示一个空白文档
Document document = DocumentHelper.createDocument();
// 2.向Document中添加根元素, students表示根标签
/**
* Document提供了添加根元素的方法:
* Element addElement(String name)
* 添加后会根据标签以一个Element实例返回,以便于我们对其继续操作,
* 注意,这个方法只能调用一次
* Element也提供了添加相关信息的方法:
* Element addElement(String name),向当前标签中添加给定标签名的子标签
* Element addText(String text),向当前标签中添加指定的文本,返回的还是当前标签
* (这样做的好处是 ,可以继续添加其他内容)
*/
Element rootElement = document.addElement("students");
// 继续添加子标签
for (Student student : list) {
// 添加student子标签
Element stu = rootElement.addElement("student");
// 添加student标签下的子标签
Element name = stu.addElement("name");
// 为name标签对象添加文本内容
name.addText(student.getName());
Element sex = stu.addElement("sex");
// sex
sex.addText(student.getSex());
Element age = stu.addElement("age");
// age
age.addText(student.getAge().toString());
}
// 创建xmlwriter对象
XMLWriter xw = new XMLWriter(new FileOutputStream("./dir/student.xml"));
xw.write(document);
xw.close();
}
}
JAVA设计模式
设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
还有两类:并发型模式和线程池模式。
设计模式的六大原则
1、开闭原则(Open Close Principle)
2、里氏代换原则(Liskov Substitution Principle)
3、依赖倒转原则(Dependence Inversion Principle)
4、接口隔离原则(Interface Segregation Principle)
5、迪米特法则(最少知道原则)(Demeter Principle)
6、合成复用原则(Composite Reuse Principle)
工厂方法模式(Factory Method)
工厂方法模式分为三种:
普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
import com.design_mode.factory.Sender;
public class SenderFactory01 {
// 生成sender对象方法
public Sender product(String name){
// 判断需要生成的对象
if ("email".equals(name)) {
return new EmailSender();
} else if ("sms".equals(name)) {
return new SmsSender();
} else if ("weixin".equals(name)) {
return new WeChatSender();
} else if ("qq".equals(name)) {
return new QQSender();
} else {
throw new RuntimeException("无法生成" + name + "对象");
}
}
}
按照同样方法写出其他几个客户
import com.design_mode.factory.Sender; public class QQSender implements Sender { @Override public void send() { System.out.println("发送qq消息"); } }
多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
import com.design_mode.factory.Sender;
public class SenderFactory02 {
// 生成邮箱对象工厂方法
public Sender productEmail(){
return new EmailSender();
}
// 生成短信对象工厂方法
public Sender productSms(){
return new SmsSender();
}
// 生成微信对象工厂方法
public Sender productWeChat(){
return new WeChatSender();
}
// 生成QQ对象工厂方法
public Sender productQQ(){
return new QQSender();
}
}
静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
import com.design_mode.factory.Sender;
public class SenderFactory03 {
// 生成邮箱对象工厂方法
public static Sender productEmail(){
return new EmailSender();
}
// 生成短信对象工厂方法
public static Sender productSms(){
return new SmsSender();
}
// 生成微信对象工厂方法
public static Sender productWeChat(){
return new WeChatSender();
}
// 生成QQ对象工厂方法
public static Sender productQQ(){
return new QQSender();
}
}