大话XML之DOM解析法
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(); } } } 希望大家多多支持!(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |