分别使用dom和dom4j解析XML文档

1.dom和dom4j的特点

  1. dom是基于XML的树结构来完成解析的。dom解析XML文档时,会根据读取的文档,构建一个驻留内存的树结构,然后就可以使用dom接口来对XML文档进行增删查改等操作。dom解析XML的方式非常适用于多次访问XML的应用程序,但是比较消耗资源。
  2. dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和易用的特点,同时他也是开放源代码的软件。如今越来越多Java软件都在使用dom4j来读写XML。

2.解析XML文档:

要解析的XML文档:


<students>
    <student>
        <name>张三name>
        <age>20age>
        <school>bdqnschool>
    student>
    <student>
        <name>李四name>
        <age>22age>
        <school>bdqnschool>
    student>
students>
  1. 准备:解析XML时,会用到以下对象,学习时了解一下,更容易理解:

    ①Document对象:代表整个XML对象,所有其他的节点(Node)都以一定的顺序包含在Document对象内,排列成一个树状结构,可以通过遍历这棵"树"来得到XML文档的所有内容。

    ②NodeList对象:包含了一个或者多个节点的列表,该数组可按下标查询。

    ③Node对象:DOM结构中最基本的对象,代表了文档树中的一个抽象节点。实际使用时,很少真正用到Node对象,一般会用Element、Text、等Node对象的子对象来操作文档。

    ④Element对象:代表XML文档中的标签元素,继承自Node。有存取标签属性的方法。

  2. 使用面向对象对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文档

准备:

  1. 下载dom4j包,可以从官网下载:https://dom4j.github.io/ 。dom4j和jdk版本尽量匹配,否则会报警告。
  2. 导入包:将下载好的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();
    }
}

你可能感兴趣的:(XML解析,xml,java,开发语言)