导读:本期聚焦于小伙伴创作的《Java解析XML有哪些方式?DOM、SAX、JDOM、DOM4J四种方式详解与对比》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java解析XML有哪些方式?DOM、SAX、JDOM、DOM4J四种方式详解与对比》有用,将其分享出去将是对创作者最好的鼓励。

Java解析XML几种方式小结

在Java开发中,XML作为一种通用的数据交换格式,经常需要我们对其进行解析处理。不同的解析方式各有特点,适用的场景也有所区别。本文将为大家总结Java中常用的几种XML解析方式,帮助大家在实际开发中做出合适的选择。

一、DOM解析方式

DOM(Document Object Model)解析是将整个XML文档加载到内存中,形成一个树形结构,之后我们可以通过操作这个树形结构来获取XML中的数据。这种方式的优点是便于随机访问和修改XML内容,缺点是因为需要加载整个文档,所以当XML文件较大时,会比较消耗内存。

下面是一段使用DOM解析XML的示例代码:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomParseDemo {
    public static void main(String[] args) {
        try {
            // 创建DocumentBuilderFactory实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 创建DocumentBuilder实例
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析XML文件,得到Document对象
            Document document = builder.parse("test.xml");
            // 获取根元素
            Element root = document.getDocumentElement();
            System.out.println("根元素名称:" + root.getNodeName());
            // 获取所有student节点
            NodeList studentList = root.getElementsByTagName("student");
            // 遍历student节点
            for (int i = 0; i < studentList.getLength(); i++) {
                Node studentNode = studentList.item(i);
                if (studentNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element studentElement = (Element) studentNode;
                    // 获取id属性
                    String id = studentElement.getAttribute("id");
                    System.out.println("学生id:" + id);
                    // 获取name子节点内容
                    Node nameNode = studentElement.getElementsByTagName("name").item(0);
                    String name = nameNode.getTextContent();
                    System.out.println("学生姓名:" + name);
                    // 获取age子节点内容
                    Node ageNode = studentElement.getElementsByTagName("age").item(0);
                    String age = ageNode.getTextContent();
                    System.out.println("学生年龄:" + age);
                    System.out.println("-------------------");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代码首先通过DocumentBuilderFactoryDocumentBuilder获取XML文档的Document对象,然后可以通过获取元素、属性、节点内容等方式解析XML数据。如果是如下的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student id="1">
        <name>张三</name>
        <age>20</age>
    </student>
    <student id="2">
        <name>李四</name>
        <age>22</age>
    </student>
</students>

运行上述Java代码后,就可以依次输出每个学生的id、姓名和年龄信息。

二、SAX解析方式

SAX(Simple API for XML)是一种基于事件驱动的解析方式,它不需要将整个XML文档加载到内存中,而是按照XML文档的顺序依次解析,遇到不同的节点(如开始标签、结束标签、文本内容等)就会触发对应的事件,我们可以在事件处理方法中编写逻辑来处理XML数据。这种方式的优点是内存占用小,适合解析大文件,缺点是不能随机访问XML内容,只能顺序解析,并且不便于修改XML内容。

下面是使用SAX解析XML的示例代码:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;

public class SaxParseDemo {
    public static void main(String[] args) {
        try {
            // 创建SAXParserFactory实例
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // 创建SAXParser实例
            SAXParser parser = factory.newSAXParser();
            // 创建自定义的Handler
            MyHandler handler = new MyHandler();
            // 解析XML文件
            parser.parse(new File("test.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// 自定义Handler,继承DefaultHandler
class MyHandler extends DefaultHandler {
    private String currentElement;
    private String currentId;

    // 遇到开始标签时触发
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        currentElement = qName;
        if ("student".equals(qName)) {
            // 获取student标签的id属性
            currentId = attributes.getValue("id");
            System.out.println("学生id:" + currentId);
        }
    }

    // 遇到文本内容时触发
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String content = new String(ch, start, length).trim();
        if (!content.isEmpty()) {
            if ("name".equals(currentElement)) {
                System.out.println("学生姓名:" + content);
            } else if ("age".equals(currentElement)) {
                System.out.println("学生年龄:" + content);
            }
        }
    }

    // 遇到结束标签时触发
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("student".equals(qName)) {
            System.out.println("-------------------");
        }
        currentElement = null;
    }
}

上述代码通过继承DefaultHandler类,重写了其中的startElementcharactersendElement方法,分别在遇到开始标签、文本内容、结束标签时执行对应的逻辑,从而完成XML的解析。同样解析前面的test.xml文件,也能得到对应的学生信息。

三、JDOM解析方式

JDOM是专门为Java设计的XML解析工具,它结合了DOM和SAX的优点,API设计更符合Java的开发习惯,使用起来比原生的DOM和SAX更加简洁。不过JDOM需要额外导入对应的jar包才能使用。

下面是使用JDOM解析XML的示例代码:

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import java.io.File;
import java.util.List;

public class JdomParseDemo {
    public static void main(String[] args) {
        try {
            // 创建SAXBuilder实例
            SAXBuilder builder = new SAXBuilder();
            // 解析XML文件得到Document对象
            Document document = builder.build(new File("test.xml"));
            // 获取根元素
            Element root = document.getRootElement();
            // 获取所有student子元素
            List<Element> studentList = root.getChildren("student");
            // 遍历student元素
            for (Element student : studentList) {
                // 获取id属性
                String id = student.getAttributeValue("id");
                System.out.println("学生id:" + id);
                // 获取name子元素内容
                String name = student.getChildText("name");
                System.out.println("学生姓名:" + name);
                // 获取age子元素内容
                String age = student.getChildText("age");
                System.out.println("学生年龄:" + age);
                System.out.println("-------------------");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

可以看到JDOM的API更加直观,获取元素、属性、文本内容的方法都很简洁,不需要像DOM那样做大量的类型转换,开发效率更高。

四、DOM4J解析方式

DOM4J也是常用的XML解析工具,它的性能优秀,API设计灵活,在很多开源框架中都有广泛应用,同样需要额外导入对应的jar包。DOM4J支持DOM和SAX两种解析方式,使用起来非常方便。

下面是使用DOM4J解析XML的示例代码:

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;

public class Dom4jParseDemo {
    public static void main(String[] args) {
        try {
            // 创建SAXReader实例
            SAXReader reader = new SAXReader();
            // 读取XML文件得到Document对象
            Document document = reader.read(new File("test.xml"));
            // 获取根元素
            Element root = document.getRootElement();
            // 获取所有student子元素的迭代器
            Iterator<Element> studentIterator = root.elementIterator("student");
            // 遍历student元素
            while (studentIterator.hasNext()) {
                Element student = studentIterator.next();
                // 获取id属性
                String id = student.attributeValue("id");
                System.out.println("学生id:" + id);
                // 获取name子元素内容
                String name = student.elementText("name");
                System.out.println("学生姓名:" + name);
                // 获取age子元素内容
                String age = student.elementText("age");
                System.out.println("学生年龄:" + age);
                System.out.println("-------------------");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

DOM4J的语法和JDOM有相似之处,但是功能更加强大,比如支持XPath查询,可以快速定位到需要的节点,在复杂XML解析场景下优势明显。

五、几种解析方式对比

为了更直观地了解几种解析方式的特点,我们通过下面的表格进行对比:

解析方式优点缺点适用场景
DOM解析可以随机访问、修改XML内容,API直观内存占用大,不适合大文件XML文件较小,需要频繁修改内容的场景
SAX解析内存占用小,解析速度快不能随机访问,不适合修改内容解析大XML文件,只需要读取内容的场景
JDOM解析API符合Java习惯,使用简洁需要额外导入jar包,性能略逊于DOM4JJava项目中快速开发,对性能要求不极端的场景
DOM4J解析性能好,功能强大,支持XPath需要额外导入jar包大多数XML解析场景,尤其是对性能和功能要求较高的场景

在实际开发中,我们可以根据XML文件的大小、是否需要修改内容、项目的技术栈等因素,选择合适的XML解析方式。如果是小文件且需要修改,优先选DOM;如果是大文件只读,优先选SAX;如果是常规开发,DOM4J和JDOM都是不错的选择,其中DOM4J的应用更为广泛。

Java解析XMLDOM解析SAX解析JDOMDOM4J 本作品最后修改时间:2026-05-22 21:39:33

免责声明:网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。