前言:
我一直以来就坚信一句话:不积跬步无以至千里,不积小流无以成江海。可能很多人对一些基础概念会选择性忽略,但往往基础和知识理解深度决定你的上限。
今天给大家带来一个对框架以及容器源码理解提升的知识点笔记:XML 解析技术,这个知识点也是大家容易忽视的知识点。
大家学完后也可以想想Tomcat是怎么解析web.xml文件的?spring框架是怎么解析 bean.xml文件的?…
https://dom4j.github.io/javadoc/1.6.1/
- 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析
- document 对象表示的是整个文档(可以是 html 文档,也可以是 xml)
● 早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介
dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java 对 dom 技术解析也做了实现
sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML ) SAX 解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。 是一行一行的读 取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在性能上优于 Dom 解析
这两种技术已经过时,知道有这两种技术即可
● 第三方的 XML 解析技术
Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。
与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。
Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j。
使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件
● 开发 dom4j 要导入 dom4j 的包
1、读取 XML 文件,获得 document 对象
SAXReader reader = new SAXReader(); //创建一个解析器
Document document = reader.read(new File("src/input.xml"));//XML Document
2、解析 XML 形式的文本,得到 document 对象
String text = " ";
Document document = DocumentHelper.parseText(text);
3、主动创建 document 对象
Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");
- 重点讲解查询(遍历和指定查询)
- xml增删改使用少,作为扩展,给出案例
<students>
<student id="01">
<name>小龙女name>
<gender>女gender>
<age>16age>
<resume>古墓派掌门人resume>
student>
<student id="02">
<name>欧阳锋name>
<gender>男gender>
<age>18age>
<resume>白驼山,蛤蟆神功resume>
student>
students>
public class Dom4j_ {
/**
* 演示如何家长在xml解析器
*/
@Test
public void loadXML() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
System.out.println(document);
}
}
org.dom4j.tree.DefaultDocument@65ae6ba4 [Document: name file:///f:/Java/JavaWeb/XML/src/DOM4J/student.xml]
想一想content为什么是5?
答:因为在里面将换行符\n也当做一个,有两个内容
,三个换行符。
我们可以再往下看看
标签里面
先获取
里面的元素
@Test
public void listStus() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
//1. 得到rootElement
Element rootElement = document.getRootElement();
System.out.println(rootElement);
}
运行结果:
org.dom4j.tree.DefaultElement@6a6824be [Element: ]
再获取
里面的元素
@Test
public void listStus() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
//1. 得到rootElement
Element rootElement = document.getRootElement();
System.out.println(rootElement);
//2. 得到rootElement的student Elements
List<Element> students = rootElement.elements("student");
System.out.println(student.size());//2
}
运行结果:
2
去遍历student里面的元素
@Test
public void listStus() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("f:/Java/JavaWeb/XML/src/DOM4J/student.xml"));
//1. 得到rootElement
Element rootElement = document.getRootElement();
//2. 得到rootElement的student Elements
List<Element> students = rootElement.elements("student");
//System.out.println(student.size());//2
for (Element student : students) {//element就是Student元素/节点
//获取Student元素 的name Element
Element name = student.element("name");
Element age = student.element("age");
Element resume = student.element("resume");
Element gender = student.element("gender");
System.out.println("学生信息= " + name.getText() + " " + age.getText() +
" " + resume.getText() + " " + gender.getText());
}
}
运行结果:
学生信息= 小龙女 16 古墓派掌门人 女
学生信息= 欧阳锋 18 白驼山,蛤蟆神功 男
/**
* 指定读取第一个学生的信息 就是 dom4j+xpath
*/
@Test
public void readOne() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/DOM4J/student.xml"));
//1. 得到rootElement, 你是OOP
Element rootElement = document.getRootElement();
//2. 获取第一个学生
Element student = (Element) rootElement.elements("student").get(1);
//3. 输出该信息
System.out.println("该学生的信息= " + student.element("name").getText() + " " +
student.element("age").getText() + " " + student.element("resume").getText() +
student.element("gender").getText());
//4. 获取student元素的属性
System.out.println("id= " + student.attributeValue("id"));
}
运行结果:
该学生的信息= 欧阳锋 18 白驼山,蛤蟆神功男
id= 02
/**
* 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
* @throws Exception
*/
@Test
public void add() throws Exception {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个xml文件
Document document = saxReader.read(new File("src/DOM4J/student.xml"));
//首先我们来创建一个学生节点对象
Element newStu = DocumentHelper.createElement("student");
Element newStu_name = DocumentHelper.createElement("name");
//如何给元素添加属性
newStu.addAttribute("id", "04");
newStu_name.setText("宋江");
//创建age元素
Element newStu_age = DocumentHelper.createElement("age");
newStu_age.setText("23");
//创建resume元素
Element newStu_intro = DocumentHelper.createElement("resume");
newStu_intro.setText("梁山老大");
//把三个子元素(节点)加到 newStu下
newStu.add(newStu_name);
newStu.add(newStu_age);
newStu.add(newStu_intro);
//再把newStu节点加到根元素
document.getRootElement().add(newStu);
//直接输出会出现中文乱码:
OutputFormat output = OutputFormat.createPrettyPrint();
output.setEncoding("utf-8");//输出的编码utf-8
//把我们的xml文件更新
// lets write to a file
//new FileOutputStream(new File("src/myClass.xml"))
//使用到io编程 FileOutputStream 就是文件字节输出流
XMLWriter writer = new XMLWriter(
new FileOutputStream("src/DOM4J/student.xml"), output);
writer.write(document);
writer.close();
}
运行结果:
<students>
<student id="01">
<name>小龙女name>
<gender>女gender>
<age>16age>
<resume>古墓派掌门人resume>
student>
<student id="02">
<name>欧阳锋name>
<gender>男gender>
<age>18age>
<resume>白驼山,蛤蟆神功resume>
student>
<student id="04">
<name>宋江name>
<age>23age>
<resume>梁山老大resume>
student>
students>