【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!

简介: 【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。

XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标准格式。在 Java 中,XML 被广泛应用于配置文件、数据交换、Web 服务等领域。本文将以议论文的形式,详细介绍 Java 中常用的几种 XML 解析技术:DOM、SAX 和 StAX,并通过示例代码展示这些技术的使用方法。

DOM 解析

DOM(Document Object Model,文档对象模型)是一种将 XML 文档转化为树形结构的方法。DOM 解析器一次性读取整个 XML 文档,并将其转化为内存中的对象模型,使得开发者可以方便地访问和修改文档中的任何部分。

示例代码

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

public class DOMParserExample {
   
    public static void main(String[] args) {
   
        try {
   
            File inputFile = new File("src/main/resources/data.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();

            System.out.println("Root element: " + doc.getDocumentElement().getNodeName());

            NodeList nList = doc.getElementsByTagName("person");

            for (int temp = 0; temp < nList.getLength(); temp++) {
   
                Node nNode = nList.item(temp);

                System.out.println("\nCurrent Element: " + nNode.getNodeName());

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
   
                    Element eElement = (Element) nNode;

                    System.out.println("Name: " + eElement.getElementsByTagName("name").item(0).getTextContent());
                    System.out.println("Age: " + eElement.getElementsByTagName("age").item(0).getTextContent());
                    System.out.println("Country: " + eElement.getElementsByTagName("country").item(0).getTextContent());
                }
            }
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

SAX 解析

SAX(Simple API for XML,XML 简单 API)是一种事件驱动型的解析方式。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 SAXParserExample {
   
    public static void main(String[] args) {
   
        try {
   
            File inputFile = new File("src/main/resources/data.xml");
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            DefaultHandler handler = new DefaultHandler() {
   
                boolean bName = false;
                boolean bAge = false;
                boolean bCountry = false;

                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
   
                    if (qName.equalsIgnoreCase("name")) {
   
                        bName = true;
                    } else if (qName.equalsIgnoreCase("age")) {
   
                        bAge = true;
                    } else if (qName.equalsIgnoreCase("country")) {
   
                        bCountry = true;
                    }
                }

                public void endElement(String uri, String localName, String qName) throws SAXException {
   
                    if (qName.equalsIgnoreCase("name")) {
   
                        bName = false;
                    } else if (qName.equalsIgnoreCase("age")) {
   
                        bAge = false;
                    } else if (qName.equalsIgnoreCase("country")) {
   
                        bCountry = false;
                    }
                }

                public void characters(char ch[], int start, int length) throws SAXException {
   
                    if (bName) {
   
                        System.out.println("Name: " + new String(ch, start, length));
                    } else if (bAge) {
   
                        System.out.println("Age: " + new String(ch, start, length));
                    } else if (bCountry) {
   
                        System.out.println("Country: " + new String(ch, start, length));
                    }
                }
            };

            saxParser.parse(inputFile, handler);
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

StAX 解析

StAX(Streaming API for XML,流式 XML API)是一种流式解析方式,它结合了 DOM 和 SAX 的优点。StAX 解析器可以逐个事件地读取 XML 文档,这使得它可以处理非常大的 XML 文件,而且不需要一次性加载整个文档到内存中。

示例代码

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.File;
import java.io.FileInputStream;

public class StAXParserExample {
   
    public static void main(String[] args) {
   
        try {
   
            File inputFile = new File("src/main/resources/data.xml");
            FileInputStream fis = new FileInputStream(inputFile);
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader reader = factory.createXMLStreamReader(fis);

            while (reader.hasNext()) {
   
                int event = reader.next();

                switch (event) {
   
                    case XMLStreamConstants.START_ELEMENT:
                        if ("person".equals(reader.getLocalName())) {
   
                            System.out.println("\nCurrent Element: " + reader.getLocalName());
                        }
                        break;
                    case XMLStreamConstants.CHARACTERS:
                        if ("name".equals(reader.getLocalName())) {
   
                            System.out.println("Name: " + reader.getText());
                        } else if ("age".equals(reader.getLocalName())) {
   
                            System.out.println("Age: " + reader.getText());
                        } else if ("country".equals(reader.getLocalName())) {
   
                            System.out.println("Country: " + reader.getText());
                        }
                        break;
                    case XMLStreamConstants.END_ELEMENT:
                        break;
                }
            }

            reader.close();
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

讨论

每种解析方式都有其适用场景:

  • DOM:适用于需要随机访问文档内容的情况。由于需要一次性加载整个文档到内存中,因此不适合处理大型文件。
  • SAX:适用于只需要顺序读取文档的部分内容的情况。由于采用事件驱动的方式,因此适合处理大型文件,但不能随机访问文档内容。
  • StAX:结合了 DOM 和 SAX 的优点,既可以处理大型文件,又允许随机访问文档内容。

总结

通过上述议论文,我们可以了解到 Java 中 XML 解析的三种主要技术:DOM、SAX 和 StAX。每种技术都有其独特的优势和适用场景。无论是在日常开发还是面试准备中,熟悉这些 XML 解析技术都是非常重要的。

相关文章
|
10月前
|
XML JavaScript 数据格式
XML 相关技术
XML 相关技术
|
10月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
338 5
|
11月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
277 4
|
11月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
144 3
|
C# 前端开发 UED
WPF数据验证实战:内置控件与自定义规则,带你玩转前端数据验证,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,数据验证是确保输入正确性的关键环节。前端验证能及时发现错误,提升用户体验和程序可靠性。本文对比了几种常用的WPF数据验证方法,并通过示例展示了如何使用内置验证控件(如`TextBox`)及自定义验证规则实现有效验证。内置控件结合`Validation`类可快速实现简单验证;自定义规则则提供了更灵活的复杂逻辑支持。希望本文能帮助开发者更好地进行WPF数据验证。
374 0
|
10月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
256 2
|
6月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
600 29
|
6月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
175 4
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
6月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。