在Java中解析和生成 XML的操作指南

 更新时间:2025年11月21日 09:27:25   作者:喵手  
XML(可扩展标记语言)是用于存储和传输数据的标准格式,在许多应用中,XML 常用于配置文件、数据交换和存储结构化信息,在 Java 中,我们可以使用不同的技术来解析和生成 XML 文件,在这篇文章中,我们将介绍这些解析方式,需要的朋友可以参考下

前言

XML(可扩展标记语言)是用于存储和传输数据的标准格式。在许多应用中,XML 常用于配置文件、数据交换和存储结构化信息。在 Java 中,我们可以使用不同的技术来解析和生成 XML 文件。常见的 XML 处理方法包括 DOM 解析SAX 解析JDOM 和 DOM4J 等。在这篇文章中,我们将介绍这些解析方式,并探讨如何将 XML 与 Java 对象进行相互转换。

1 XML 基础语法

在深入了解 XML 解析之前,我们先回顾一下 XML 的基础语法:

声明:XML 文件可以包含一个声明,指定 XML 的版本和编码格式。

<?xml version="1.0" encoding="UTF-8"?>

元素:XML 中的数据存储在元素(tags)中,每个元素由开始标签、内容和结束标签组成。

<person>
    <name>John</name>
    <age>30</age>
</person>

属性:元素可以包含属性,属性是键值对形式的额外信息。

<person id="123">
    <name>John</name>
    <age>30</age>
</person>

注释:可以在 XML 文件中使用注释。

<!-- This is a comment -->

根元素:一个有效的 XML 文件必须有一个根元素,所有其他元素都必须嵌套在根元素内。

2 DOM 解析方式

DOM(Document Object Model) 是一种基于树形结构的解析方式,它会将整个 XML 文档加载到内存中,形成一个文档对象模型(DOM 树)。在 DOM 中,XML 文档的每个元素都是一个节点,可以通过节点的属性、内容等进行访问和修改。

2.1 DOM 解析的优点和缺点

优点

  • 解析后的数据结构(DOM 树)可以随机访问,方便对 XML 文档进行修改。
  • 支持对 XML 文档的增、删、改操作。

缺点

  • 内存开销大,适合处理小型或中型的 XML 文件。
  • 加载整个 XML 文档需要较长的时间,处理大型文件时可能效率低下。

2.2 使用 DOM 解析 XML

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

public class DOMExample {
    public static void main(String[] args) throws Exception {
        File inputFile = new File("example.xml");
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(inputFile);

        doc.getDocumentElement().normalize();

        NodeList nodeList = doc.getElementsByTagName("person");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                System.out.println("Name: " + element.getElementsByTagName("name").item(0).getTextContent());
                System.out.println("Age: " + element.getElementsByTagName("age").item(0).getTextContent());
            }
        }
    }
}

在上面的代码中,使用 DocumentBuilder 解析 XML 文件并创建 DOM 树。然后,使用 getElementsByTagName 获取所有 <person> 元素,并通过 getTextContent() 获取每个元素的内容。

3 SAX 解析方式

SAX(Simple API for XML) 是一种基于事件的解析方式,不像 DOM 那样将整个 XML 文件加载到内存中。SAX 解析器在解析 XML 时,会逐行读取并触发相应的事件(如开始标签、结束标签等)。SAX 解析方式适用于处理大型 XML 文件,因为它不会将整个文件加载到内存中,而是逐个元素处理。

3.1 SAX 解析的优点和缺点

优点

  • 内存开销小,适用于处理大型 XML 文件。
  • 高效,适用于只读取 XML 数据的场景。

缺点

  • 无法随机访问 XML 数据,因为 SAX 是基于事件的,不会保留整个文档的结构。
  • 不支持修改 XML 文件。

3.2 使用 SAX 解析 XML

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;

public class SAXExample {
    public static void main(String[] args) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        parser.parse("example.xml", new DefaultHandler() {
            boolean isName = false;
            boolean isAge = false;

            public void startElement(String uri, String localName, String qName, Attributes attributes) {
                if (qName.equalsIgnoreCase("name")) {
                    isName = true;
                } else if (qName.equalsIgnoreCase("age")) {
                    isAge = true;
                }
            }

            public void characters(char[] ch, int start, int length) {
                if (isName) {
                    System.out.println("Name: " + new String(ch, start, length));
                    isName = false;
                }
                if (isAge) {
                    System.out.println("Age: " + new String(ch, start, length));
                    isAge = false;
                }
            }
        });
    }
}

在 SAX 解析中,我们通过继承 DefaultHandler 类并重写 startElement()characters() 方法来处理 XML 元素的开始标签和文本内容。SAX 解析器在读取到元素时会触发这些方法。

4 JDOM 和 DOM4J

JDOMDOM4J 是 Java 中常用的第三方 XML 处理库,它们为 XML 的解析和操作提供了更简洁和高效的 API。

4.1 JDOM

JDOM 提供了类似于 DOM 的树结构,但它使用 Java 的集合框架,并且操作更方便。JDOM 允许你以更直观的方式处理 XML 数据,并且在性能上相较于 DOM 更加高效。

4.2 DOM4J

DOM4J 是另一个流行的 XML 处理库,提供了功能强大的 XML 操作 API。DOM4J 支持 XPath、XSLT 等功能,适用于更加复杂的 XML 处理需求。

5 XML 与 Java 对象转换

在实际开发中,我们通常需要将 XML 与 Java 对象相互转换。常用的 XML 与 Java 对象的转换方式有两种:JAXB(Java Architecture for XML Binding)和 XStream

5.1 使用 JAXB 进行 XML 与 Java 对象转换

JAXB 是 Java 提供的标准 API,用于将 Java 对象序列化为 XML,或者将 XML 反序列化为 Java 对象。

import javax.xml.bind.*;

@XmlRootElement
class Person {
    private String name;
    private int age;

    @XmlElement
    public String getName() {
        return name;
    }

    @XmlElement
    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class JAXBExample {
    public static void main(String[] args) throws Exception {
        Person person = new Person();
        person.setName("John");
        person.setAge(30);

        // 转换 Java 对象为 XML
        JAXBContext context = JAXBContext.newInstance(Person.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(person, System.out);

        // 将 XML 转换为 Java 对象
        String xml = "<person><name>John</name><age>30</age></person>";
        Unmarshaller unmarshaller = context.createUnmarshaller();
        Person personFromXML = (Person) unmarshaller.unmarshal(new StringReader(xml));
        System.out.println(personFromXML.getName() + ", " + personFromXML.getAge());
    }
}

JAXB 使用 @XmlRootElement@XmlElement 注解来定义类和字段的映射关系。通过 MarshallerUnmarshaller,我们可以方便地将 Java 对象和 XML 进行相互转换。

小结

XML 是一种常用的数据存储和交换格式,Java 提供了多种方式来解析和生成 XML 文件。DOM 和 SAX 是两种经典的解析方式,分别适用于不同的应用场景。JDOM 和 DOM4J 提供了更高效、易用的 XML 操作 API。而通过 JAXB 等技术,我们可以方便地将 XML 与 Java 对象进行相互转换。掌握这些 XML 处理技术,可以帮助我们在开发中更好地利用 XML 进行数据存储和传输。

以上就是在Java中解析和生成 XML的操作指南的详细内容,更多关于Java解析和生成XML的资料请关注脚本之家其它相关文章!

相关文章

  • java中的类URL与URLConnection使用介绍

    java中的类URL与URLConnection使用介绍

    这篇文章主要为大家介绍了java中的类URL与URLConnection使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • mapstruct的用法之qualifiedByName示例详解

    mapstruct的用法之qualifiedByName示例详解

    qualifiedByName的意思就是使用这个Mapper接口中的指定的默认方法去处理这个属性的转换,而不是简单的get set,今天通过本文给大家介绍下mapstruct的用法之qualifiedByName示例详解,感兴趣的朋友一起看看吧
    2022-04-04
  • java多线程编程之java线程简介

    java多线程编程之java线程简介

    线程是程序运行的基本执行单元,线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈
    2014-01-01
  • 实例详解java Struts2的配置与简单案例

    实例详解java Struts2的配置与简单案例

    这篇文章主要介绍了java Struts2的配置与简单案例,需要的朋友可以参考下
    2017-04-04
  • springboot整合knife4j全过程

    springboot整合knife4j全过程

    这篇文章主要介绍了springboot整合knife4j全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 精致小巧的java相册制作方法

    精致小巧的java相册制作方法

    这篇文章主要为大家详细介绍了精致小巧的java相册制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • java中javaBean与Bean的深入理解

    java中javaBean与Bean的深入理解

    这篇文章主要介绍了java中javaBean与Bean的深入理解的相关资料,这里说明他们的优点及使用方法,需要的朋友可以参考下
    2017-08-08
  • 详解JDBC对Mysql utf8mb4字符集的处理

    详解JDBC对Mysql utf8mb4字符集的处理

    这篇文章主要介绍了详解JDBC对Mysql utf8mb4字符集的处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Springboot详细讲解RocketMQ实现顺序消息的发送与消费流程

    Springboot详细讲解RocketMQ实现顺序消息的发送与消费流程

    RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,本篇我们了解如何实现顺序消息的发送与消费
    2022-06-06
  • Java集合类中文介绍

    Java集合类中文介绍

    本文首先对Java集合类框架做了简单说明,之后对主要类和为API做了介绍:Collection、List、Set、AbstractCollection、AbstractList、AbstractSet、Iterator、ListIterator。
    2013-11-11

最新评论