加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

大话XML之DOM解析法

发布时间:2020-12-16 09:07:15 所属栏目:百科 来源:网络整理
导读:DOM(Document Object Model)文档对象模型,是W3c组织推荐的处理xml的一种方式。dom解析器在解析xml文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个的Node对象(节点)。不适合处理大得xml文件 优点: 把xml文件在内存中构造树型结构,树
DOM(Document Object Model)文档对象模型,是W3c组织推荐的处理xml的一种方式。dom解析器在解析xml文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个的Node对象(节点)。不适合处理大得xml文件
优点:
把xml文件在内存中构造树型结构,树在内存中是持久的,所以可遍历和修改节点。
可以在任何时候在树中上下导航,不像sax那样是一次性的处理。
dom API是读写的,sax是只读的。
缺点:若文件较大,内存有压力,在内存中构建一个dom树开销比较大。
解析时间会比较长。

下面是DOM解析的步骤分析(流程)

DOM解析XML步骤

使用SAXReader需要导入dom4j.jar包

dom4j:是一个java的XML API,类似JDOM,用来读和写XML文件的,

他是一个非常优秀的JAVA XML API,具有性能优异,功能强大和易用

的特点,他也是一个开放源代码的软件。

使用步骤:

1.导入dom4j.jar开发包

2.创建SAXReader类的对象来实现读取XML文档

SAXReader reader = new SAXReader();

3.使用SAXReader类的read方法获取Document对象,Document对象是

一颗文档树的根,可以为我们提供对文档数据的最初(或最顶层的访问入口)

Document doc = reader.read("XML文件路径,通常用类加载器获取");

4.使用Document对象的getRootElement方法获取要解析的XML文件的根元素,

该方法返回值类型为Element,Element对象表示XML文档中的元素。元素可包含

属性,其他元素或文本,若元素包含文本,则在文本节点中表示该文本

Element root = doc.getRootElement();

5.接下来可以使用Element对象提供的方法继续解析XML文档,例如:elements方法

用于获取当前元素下的所有子元素

List<Element> elements = root.elements();



下面看个案例:
下面是个最简单不过的xml文档:

<?xmlversion="1.0"encoding="UTF-8"?>

<list>

<empid="1">

<name>tom</name>

<age>34</age>

<gender>F</gender>

<salary>30000</salary>

</emp>

<empid="2">

<name>jerry</name>

<age>24</age>

<gender>M</gender>

<salary>60000</salary>

</emp>

</list>

下面是个封装xml文档的这些数据的一个实体类

package day01;


/**

* 对应XML文档的实体类

* @author chen

*

*/

public class Emp {

privateintid;

private Stringname;

privateintage;

private Stringgender;

privatedoublesalary;

public Emp(intid,Stringname,intage,Stringgender,doublesalary) {

super();

this.id =id;

this.name =name;

this.age =age;

this.gender =gender;

this.salary =salary;

}

public Emp() {

super();

}

public int getId() {

returnid;

}

public void setId(int id) {

this.id =id;

}

public String getName() {

returnname;

}

public void setName(String name) {

this.name =name;

}

public int getAge() {

returnage;

}

public void setAge(int age) {

this.age =age;

}

public String getGender() {

returngender;

}

public void setGender(String gender) {

this.gender =gender;

}

public double getSalary() {

returnsalary;

}

public void setSalary(double salary) {

this.salary =salary;

}

@Override

public String toString() {

return"Emp [id=" +id +",name=" +name +",age=" +age

+ ",gender=" +gender +",salary=" +salary +"]";

}

}


真正的解析步骤:

package day01;


import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;


import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;


* DOM解析XML文档

*/

public class TestDOMRes {


@Test

public void testReadXML() {

try {

//0.导入dom4j.jar开发包

//1.创建SAXReader对象

SAXReader reader =new SAXReader();

//2.利用SAXReader的read方法读取指定XML文档

/*

* DOM耗时的地方就在这里,这一步就会将给定的文档内容

* 全部解析完毕,并保存到一个Document对象中,由于都

* 存入内存了,所以若XML文档内容比较多,内存就会有压力

*/

InputStream path = TestDOMRes.class.getClassLoader().

getResourceAsStream("EmpList.xml");

Document doc =reader.read(path);

//3.使用Document对象的getRootElement方法获取XML文档根元素

Element ele =doc.getRootElement();

//4.使用Element的elements方法获取<list>节点下的所有元素

List<Element> elements =ele.elements();

//5.创建保存所有员工对象的集合

List<Emp> emps =new ArrayList<Emp>();

//5.1 遍历上一步的elements集合,每循环一次获取一个emp元素

for(Elementelement :elements) {

//5.2 使用Element对象的attribute方法获取id对应的Attribute对象

//然后在使用Attribute对象的getValue方法可以获取到属性id对应的文本信息

int id = Integer.parseInt(element.attribute("id").getValue());

//5.3 使用Element对象的elementText方法获取节点对应的文本信息

String name =element.elementText("name");

int age = Integer.parseInt(element.elementText("age"));

String gender =element.elementText("gender");

double salary = Double.parseDouble(element.elementText("salary"));

//5.4 将上述信息存储到emp对象。并将对象放入list集合

Emp emp =new Emp(id,name,age,gender,salary);

emps.add(emp);

}

//6.将emps集合的信息输出到控制台

System.out.println("解析完毕");

System.out.println(emps);

} catch(Exceptione) {

e.printStackTrace();

}

}

}

希望大家多多支持!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读