1.dom和dom4j的特点
- dom是基于XML的树结构来完成解析的。dom解析XML文档时,会根据读取的文档,构建一个驻留内存的树结构,然后就可以使用dom接口来对XML文档进行增删查改等操作。dom解析XML的方式非常适用于多次访问XML的应用程序,但是比较消耗资源。
- dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和易用的特点,同时他也是开放源代码的软件。如今越来越多Java软件都在使用dom4j来读写XML。
2.解析XML文档:
要解析的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student>
<name>张三</name>
<age>20</age>
<school>bdqn</school>
</student>
<student>
<name>李四</name>
<age>22</age>
<school>bdqn</school>
</student>
</students>
-
准备:解析XML时,会用到以下对象,学习时了解一下,更容易理解:
①Document对象:代表整个XML对象,所有其他的节点(Node)都以一定的顺序包含在Document对象内,排列成一个树状结构,可以通过遍历这棵"树"来得到XML文档的所有内容。
②NodeList对象:包含了一个或者多个节点的列表,该数组可按下标查询。
③Node对象:DOM结构中最基本的对象,代表了文档树中的一个抽象节点。实际使用时,很少真正用到Node对象,一般会用Element、Text、等Node对象的子对象来操作文档。
④Element对象:代表XML文档中的标签元素,继承自Node。有存取标签属性的方法。
-
使用面向对象对XML进行解析:
首先创建student类,根据解析XML文件后获得的值新建学生对象,用来输出信息
/**
* student类
* 属性:name age school
* 方法:show()
*/
public class Student {
private String name;
private String age;
private String school;
public Student() {
}
public Student(String name, String age, String school) {
this.name = name;
this.age = age;
this.school = school;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
//打印学生信息
public void showInfo(){
System.out.println("姓名:"+this.name+"\n年龄:"+this.age+"\n学校:"+this.school);
System.out.println("***********");
}
}
做好准备工作后,开始进行解析
1)使用dom解析XML文档
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
/**
* DOM解析类
* 属性: document name age school
* 方法:getDom() showEle()
*/
public class StudentDOM {
//解析对象
private Document document;
//学生信息字段
private String name,age,school;
//生成dom树
public void getDom(File file) {
//创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//创建解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
//解析XMl文件得到Dom树;
this.document=builder.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//解析XML
public void showEle(){
//获得student节点node列表
NodeList students = document.getElementsByTagName("student");
//遍历循环student节点的子节点
for (int i = 0; i < students.getLength(); i++) {
//转换为标签元素
Element student=(Element)students.item(i);
//1.根据name节点获得姓名标签
NodeList names = student.getElementsByTagName("name");
for (int j = 0; j < names.getLength(); j++) {
Element nameEle=(Element)names.item(j);
//获得姓名标签的文本值
this.name = nameEle.getTextContent();
}
//2.根据age节点获得年龄标签
NodeList ages = student.getElementsByTagName("age");
for (int j = 0; j < ages.getLength(); j++) {
Element ageEle=(Element)ages.item(j);
this.age = ageEle.getTextContent();
}
//3.根据school节点获得学校标签
NodeList schools = student.getElementsByTagName("school");
for (int j = 0; j < schools.getLength(); j++) {
Element schoolEle=(Element)schools.item(j);
this.school = schoolEle.getTextContent();
}
//根据获得信息新建学生对象,展示
Student stu=new Student(name,age,school);
stu.showInfo();
}
}
}
import java.io.File;
/**
* 测试类
*/
public class StudentTest {
public static void main(String[] args){
//新建解析类对象
StudentDOM studentDOM=new StudentDOM();
//新建file对象
File file=new File("src/exam2/Student.xml");
//初始化 生成dom树
studentDOM.getDom(file);
//调用解析方法
studentDOM.showEle();
}
}
2)使用dom4j解析XML文档
准备:
- 下载dom4j包,可以从官网下载:https://dom4j.github.io/ 。dom4j和jdk版本尽量匹配,否则会报警告。
- 导入包:将下载好的jar包放在项目src目录下,右键 add as library
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
/**
* 文档解析类 dom4j
* 属性: document name age school
* 方法:getDom() showXML()
*/
public class stuDom4j {
//新建document对象
Document document=null;
//新建学生属性
private String name,age,school;
//使用dom4j创建dom树
public void getDom(File file){
//创建SAXreader对象
SAXReader reader=new SAXReader();
try {
//解析xml文件,获得dom树
this.document=reader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
}
//解析XML文档
public void showXML(){
//获取根节点 students
Element rootEle = document.getRootElement();
//迭代输出根节点的子节点 student
Iterator<Element> itStu = rootEle.elementIterator();
while(itStu.hasNext()){
//获得studnet元素节点
Element stuEle = itStu.next();
//1.根据name标签获得姓名
Iterator<Element> itName = stuEle.elementIterator("name");
while(itName.hasNext()){
//获得name标签元素
Element nameEle = itName.next();
//获得name文本值
this.name= nameEle.getText();
}
//2.根据age标签获得年龄
Iterator<Element> itAge = stuEle.elementIterator("age");
while(itAge.hasNext()){
Element ageEle = itAge.next();
this.age= ageEle.getText();
}
//3.根据school标签获得学校
Iterator<Element> itSchool = stuEle.elementIterator("school");
while(itSchool.hasNext()){
Element schoolEle = itSchool.next();
this.school= schoolEle.getText();
}
//根据获得信息新建学生对象,展示
Student stu=new Student(name,age,school);
stu.showInfo();
}
}
}
import java.io.File;
/**
* 测试类
*/
public class stuDom4jTest {
public static void main(String[] args) {
stuDom4j stuDom4j=new stuDom4j();
File file=new File("src/exam2/Student.xml");
stuDom4j.getDom(file);
stuDom4j.showXML();
}
}