Java基础中如何解析XML文件

来源:我的博客作者:松松建站头衔:草根站长
导读:本期聚焦于小伙伴创作的《Java基础中如何解析XML文件》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java基础中如何解析XML文件》有用,将其分享出去将是对创作者最好的鼓励。

XML作为结构化的数据格式,在配置文件、数据交互等场景中被广泛使用,Java基础开发中提供了多种原生的XML解析方式,开发者可以根据实际需求选择合适的方案。不同的解析方式在内存占用、解析效率、使用复杂度上各有差异,掌握这些基础解析方法能应对大部分常规开发场景。

Java基础中如何解析XML文件

常见的Java XML解析方式

Java原生支持的XML解析方式主要分为三类,分别是DOM解析、SAX解析和StAX解析,三者的核心差异在于解析过程和适用场景不同。

DOM解析

DOM即文档对象模型,解析时会将整个XML文档加载到内存中,构建一个树形结构的文档对象,开发者可以通过操作这个树形对象来获取、修改XML中的数据。这种方式的优点是便于随机访问文档中的任意节点,操作直观,缺点是需要占用较多内存,不适合解析超大体积的XML文件。

DOM解析的基本使用步骤如下:

  • 创建文档构建器工厂实例
  • 通过工厂获取文档构建器
  • 解析XML文件得到文档对象
  • 通过文档对象获取根节点,再遍历子节点获取数据

以下是DOM解析XML的代码示例,假设待解析的XML文件名为user.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1">
        <name>张三</name>
        <age>25</age>
    </user>
    <user id="2">
        <name>李四</name>
        <age>28</age>
    </user>
</users>

对应的DOM解析代码:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

public class DomParseDemo {
    public static void main(String[] args) {
        try {
            // 创建文档构建器工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 获取文档构建器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析XML文件得到文档对象
            Document document = builder.parse(new File("user.xml"));
            // 获取根节点users
            Element root = document.getDocumentElement();
            // 获取所有user节点
            NodeList userNodes = root.getElementsByTagName("user");
            // 遍历user节点
            for (int i = 0; i < userNodes.getLength(); i++) {
                Element userElement = (Element) userNodes.item(i);
                // 获取user节点的id属性
                String id = userElement.getAttribute("id");
                // 获取name子节点内容
                String name = userElement.getElementsByTagName("name").item(0).getTextContent();
                // 获取age子节点内容
                String age = userElement.getElementsByTagName("age").item(0).getTextContent();
                System.out.println("用户id:" + id + ",姓名:" + name + ",年龄:" + age);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

SAX解析

SAX即简单API for XML,是一种基于事件驱动的解析方式,解析时不会将整个文档加载到内存,而是逐行读取XML内容,遇到不同的节点(如开始标签、结束标签、文本内容)时触发对应的事件,开发者通过重写事件处理方法来实现数据获取。这种方式的优点是内存占用小,解析速度快,适合解析大体积XML文件,缺点是不能随机访问节点,只能顺序解析,且不支持修改XML内容。

SAX解析的基本使用步骤如下:

  • 创建SAX解析器工厂实例
  • 通过工厂获取SAX解析器
  • 创建自定义的事件处理器,重写对应事件方法
  • 解析XML文件并绑定事件处理器

以下是SAX解析上述user.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 {
            // 创建SAX解析器工厂
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // 获取SAX解析器
            SAXParser parser = factory.newSAXParser();
            // 创建自定义事件处理器
            DefaultHandler handler = new DefaultHandler() {
                // 当前解析的user节点的id属性
                private String currentId;
                // 当前解析的标签名
                private String currentTag;
                // 开始解析元素时触发
                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    currentTag = qName;
                    if ("user".equals(qName)) {
                        // 获取user节点的id属性
                        currentId = attributes.getValue("id");
                    }
                }
                // 解析到元素文本内容时触发
                @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(currentTag)) {
                            System.out.print("用户id:" + currentId + ",姓名:" + content + ",");
                        } else if ("age".equals(currentTag)) {
                            System.out.println("年龄:" + content);
                        }
                    }
                }
                // 结束解析元素时触发
                @Override
                public void endElement(String uri, String localName, String qName) throws SAXException {
                    currentTag = null;
                }
            };
            // 解析XML文件
            parser.parse(new File("user.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

StAX解析

StAX即流式API for XML,是一种基于拉取模式的解析方式,开发者可以主动控制解析过程,通过循环拉取XML中的事件,再根据事件类型处理对应的数据。它结合了DOM和SAX的优点,内存占用小,同时支持开发者主动控制解析进度,使用起来比SAX更灵活。StAX主要分为两种编程模型,分别是迭代器模型和光标模型,实际开发中迭代器模型使用更普遍。

StAX迭代器模型解析的基本使用步骤如下:

  • 创建XML输入工厂实例
  • 通过工厂创建XML事件读取器
  • 循环拉取事件,判断事件类型并处理

以下是StAX解析上述user.xml的代码示例:

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.io.FileInputStream;
import java.util.Iterator;

public class StaxParseDemo {
    public static void main(String[] args) {
        try {
            // 创建XML输入工厂
            XMLInputFactory factory = XMLInputFactory.newInstance();
            // 创建XML事件读取器
            XMLEventReader eventReader = factory.createXMLEventReader(new FileInputStream("user.xml"));
            String currentId = null;
            String currentTag = null;
            // 循环拉取事件
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                // 判断是开始元素事件
                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                    currentTag = startElement.getName().getLocalPart();
                    if ("user".equals(currentTag)) {
                        // 获取user节点的id属性
                        Iterator<Attribute> attributes = startElement.getAttributes();
                        while (attributes.hasNext()) {
                            Attribute attribute = attributes.next();
                            if ("id".equals(attribute.getName().getLocalPart())) {
                                currentId = attribute.getValue();
                            }
                        }
                    }
                }
                // 判断是字符事件(文本内容)
                if (event.isCharacters()) {
                    String content = event.asCharacters().getData().trim();
                    if (!content.isEmpty()) {
                        if ("name".equals(currentTag)) {
                            System.out.print("用户id:" + currentId + ",姓名:" + content + ",");
                        } else if ("age".equals(currentTag)) {
                            System.out.println("年龄:" + content);
                        }
                    }
                }
                // 判断是结束元素事件
                if (event.isEndElement()) {
                    currentTag = null;
                }
            }
            eventReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三种解析方式的选择建议

在实际开发中,可以根据以下场景选择合适的解析方式:

解析方式内存占用随机访问适用场景
DOM解析支持XML文件体积小,需要频繁修改、随机访问节点内容
SAX解析不支持XML文件体积大,只需要读取内容,不需要修改
StAX解析部分支持XML文件体积大,需要主动控制解析进度,灵活性要求高

如果开发中没有特殊需求,小体积XML文件优先选择DOM解析,开发效率更高,大体积文件优先选择StAX解析,兼顾性能和灵活性。

XML解析Java_DOMSAX解析StAX解析修改时间:2026-06-16 14:03:44

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