分别使用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文档:

<?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>
  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();
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DOMdom4j都是用于解析XML文档的工具,它们的使用方法略有不同。下面分别介绍DOMdom4j解析XML使用方法: 1. 使用DOM解析XML 使用DOM解析XML时,需要按照以下步骤进行: ```java // 1. 创建 DocumentBuilderFactory 对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 2. 创建 DocumentBuilder 对象 DocumentBuilder builder = factory.newDocumentBuilder(); // 3. 通过 DocumentBuilder 解析 XML 文件,得到 Document 对象 Document document = builder.parse(new File("xml文件路径")); // 4. 获取根节点 Element root = document.getDocumentElement(); // 5. 获取子节点、属性节点等 NodeList nodeList = root.getElementsByTagName("节点名称"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; // 获取子节点等操作 } else if (node.getNodeType() == Node.ATTRIBUTE_NODE) { Attr attribute = (Attr) node; // 获取属性节点等操作 } } ``` 2. 使用dom4j解析XML 使用dom4j解析XML时,需要按照以下步骤进行: ```java // 1. 读取 XML 文件 SAXReader reader = new SAXReader(); Document document = reader.read(new File("xml文件路径")); // 2. 获取根节点 Element root = document.getRootElement(); // 3. 获取子节点、属性节点等 List<Element> nodeList = root.elements("节点名称"); for (Element element : nodeList) { // 获取子节点等操作 List<Attribute> attributeList = element.attributes(); for (Attribute attribute : attributeList) { // 获取属性节点等操作 } } ``` 以上是DOMdom4j解析XML的基本使用方法。需要注意的是,使用DOM解析XML时,由于要将整个XML文档加载到内存中,因此对于大型XML文档,可能会出现内存溢出等问题。而dom4j相对于DOM,提供了更加方便的API和更高效的内存管理方式,因此在解析大型XML文档时,dom4j可能更加适合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远离bug,珍爱头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值