JAVA |日常开发中读写XML详解

news2025/1/14 18:28:13

在这里插入图片描述
在这里插入图片描述

JAVA |日常开发中读写XML详解

  • 前言
  • 一、XML 简介
  • 二、在 Java 中读取 XML
    • 2.1 使用 DOM(Document Object Model)方式读取 XML
    • 2.2 使用 SAX(Simple API for XML)方式读取 XML
  • 三、在 Java 中写入 XML
    • 3.1 使用 DOM 方式写入 XML
  • 结束语
  • 优质源码分享

JAVA |日常开发中读写XML详解,以下是 Java 日常开发中常见问题的归纳讲解:语法错误相关问题,数据类型相关问题,面向对象编程相关问题,集合类相关问题,文件操作和输入输出相关问题等详解,内有代码示例。

前言

        在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。

一、XML 简介

    XML(eXtensible Markup Language)是一种可扩展标记语言,它被设计用来传输和存储数据。XML 的结构类似于 HTML,都是由标签组成,但 XML 的标签是可以自定义的,这使得它具有很强的灵活性。

  • 例如,一个简单的 XML 文件可以用来存储书籍信息:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="cooking">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</price>
    </book>
</bookstore>

    在这个例子中,<?xml version="1.0" encoding="UTF-8"?>是 XML 的声明,它定义了 XML 的版本和编码方式。是根元素,是子元素,并且元素有一个属性category。

二、在 Java 中读取 XML

2.1 使用 DOM(Document Object Model)方式读取 XML

    DOM 方式会将整个 XML 文档加载到内存中,形成一个树形结构,然后可以通过遍历这个树形结构来获取 XML 中的数据。

    首先,需要导入相关的 Java XML 库。在 Java 中,主要是org.w3c.dom和javax.xml.parsers包。

  • 以下是一个简单的读取 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;
import java.io.File;

public class ReadXMLWithDOM {
    public static void main(String[] args) {
        try {
            File xmlFile = new File("books.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            doc.getDocumentElement().normalize();

            NodeList nList = doc.getElementsByTagName("book");
            for (int i = 0; i < nList.getLength(); i++) {
                Node nNode = nList.item(i);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    System.out.println("Book title: " + eElement.getElementsByTagName("title").item(0).getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

    上述代码首先创建一个DocumentBuilderFactory对象,然后使用它创建一个DocumentBuilder。通过DocumentBuilder的parse方法将 XML 文件解析为一个Document对象。Document对象代表了整个 XML 文档的树形结构。通过getElementsByTagName方法可以获取具有指定标签名的节点列表,然后遍历这个列表来获取每个元素中的元素的文本内容。

2.2 使用 SAX(Simple API for XML)方式读取 XML

    SAX 是一种基于事件驱动的 XML 解析方式。它不会将整个 XML 文档加载到内存中,而是在解析 XML 文档的过程中,当遇到特定的 XML 结构(如开始标签、结束标签、文本内容等)时,会触发相应的事件,通过定义事件处理器来处理这些事件,从而获取 XML 中的数据。
要使用 SAX,需要实现org.xml.sax.ContentHandler接口来定义事件处理器。以下是一个简单的示例,用于统计 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 ReadXMLWithSAX {
    public static void main(String[] args) {
        try {
            File xmlFile = new File("books.xml");
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            MyHandler handler = new MyHandler();
            saxParser.parse(xmlFile, handler);
            System.out.println("Number of books: " + handler.getBookCount());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyHandler extends DefaultHandler {
    private int bookCount = 0;

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (qName.equalsIgnoreCase("book")) {
            bookCount++;
        }
    }

    public int getBookCount() {
        return bookCount;
    }
}

    在这个示例中,MyHandler类继承自DefaultHandler,并重写了startElement方法。当 SAX 解析器遇到开始标签时,会调用startElement方法。如果遇到标签,就会将bookCount加 1。最后,通过getBookCount方法获取书籍的数量。

三、在 Java 中写入 XML

3.1 使用 DOM 方式写入 XML

  • 以下是一个简单的示例,用于创建一个新的 XML 文件并写入书籍信息:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class WriteXMLWithDOM {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.newDocument();

            Element bookstore = doc.createElement("bookstore");
            doc.appendChild(bookstore);

            Element book = doc.createElement("book");
            bookstore.appendChild(book);

            Element title = doc.createElement("title");
            title.setTextContent("New Book");
            book.appendChild(title);

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("new_books.xml"));
            transformer.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

    首先,通过DocumentBuilder创建一个新的Document对象。然后,使用createElement方法创建 XML 元素,并使用appendChild方法将元素添加到文档树中。设置好元素的文本内容后,通过Transformer将Document对象转换为 XML 文件并保存到磁盘上。
使用 JAXB(Java Architecture for XML Binding)方式写入 XML
JAXB 提供了一种将 Java 对象与 XML 数据进行相互转换的机制。首先需要定义 Java 类来对应 XML 的结构。

  • 假设我们有一个Book类和一个Bookstore类来对应上面的 XML 结构:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.util.ArrayList;
import java.util.List;

class Book {
    private String title;
    private String author;
    private int year;
    private double price;

    // 构造函数、getter和setter方法省略
}

class Bookstore {
    private List<Book> books = new ArrayList<>();

    public void addBook(Book book) {
        books.add(book);
    }

    // 其他方法省略
}
  • 以下是使用 JAXB 将Bookstore对象转换为 XML 并保存的示例代码:
public class WriteXMLWithJAXB {
    public static void main(String[] args) {
        try {
            Bookstore bookstore = new Bookstore();
            Book book = new Book();
            book.setTitle("Another New Book");
            book.setAuthor("New Author");
            book.setYear(2024);
            book.setPrice(35.0);
            bookstore.addBook(book);

            JAXBContext jaxbContext = JAXBContext.newInstance(Bookstore.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(bookstore, new File("jaxb_books.xml"));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

    在这个示例中,首先创建了Bookstore和Book对象,并设置了相关属性。然后通过JAXBContext和Marshaller将Bookstore对象转换为 XML 格式并保存到文件中。setProperty方法用于设置输出格式为格式化后的 XML。

结束语

        亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

         愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

        至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


--------------- 业精于勤,荒于嬉 ---------------
 

请添加图片描述

--------------- 行成于思,毁于随 ---------------

优质源码分享

  • 【百篇源码模板】html5各行各业官网模板源码下载

  • 【模板源码】html实现酷炫美观的可视化大屏(十种风格示例,附源码)

  • 【VUE系列】VUE3实现个人网站模板源码

  • 【HTML源码】HTML5小游戏源码

  • 【C#实战案例】C# Winform贪吃蛇小游戏源码


在这里插入图片描述


     💞 关注博主 带你实现畅游前后端

     🏰 大屏可视化 带你体验酷炫大屏

     💯 神秘个人简介 带你体验不一样得介绍

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有) ,https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/144189058(防止抄袭,原文地址不可删除)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集&#xff0c;目的评估视觉-语言模型&#xff08;VLM&#xff09;在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白&#xff0c;提供了超过10,000个经过人工验证的指…

南昌榉之乡托养机构解读:自闭症与看电视并无必然联系

在探讨自闭症的成因时&#xff0c;有人会问&#xff1a;自闭症是多看电视引起的吗&#xff1f;今天&#xff0c;就让我们来看看南昌榉之乡托养机构对此有何见解。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校&#xff0c;一直致力于为大龄自闭症患者提供专业的支持…

LabVIEW MathScript工具包对运行速度的影响及优化方法

LabVIEW 的 MathScript 工具包 在运行时可能会影响程序的运行速度&#xff0c;主要是由于以下几个原因&#xff1a; 1. 解释型语言执行方式 MathScript 使用的是类似于 MATLAB 的解释型语言&#xff0c;这意味着它不像编译型语言&#xff08;如 C、C 或 LabVIEW 本身的 VI&…

基于eFramework车控车设中间件介绍

车设的发展&#xff0c;起源于汽车工业萌芽之初&#xff0c;经历了机械式操作的原始粗犷&#xff0c;到电子式调控技术的巨大飞跃&#xff0c;到如今智能化座舱普及&#xff0c;远程车控已然成为汽车标配&#xff0c;车设功能选项也呈现出爆发式增长&#xff0c;渐趋多元繁杂。…

使用 AWR 进行 Exadata 性能诊断 - 2018版

本文和之前的使用 AWR 进行 Exadata 性能诊断是非常类似的&#xff0c;理论部分几乎一样&#xff0c;但案例部分是不同的&#xff0c;其价值也在于此。前文是基于Exadata X10&#xff0c;本文是基于Exadata X5。当然&#xff0c;型号并不重要&#xff0c;重要的是分析过程。 本…

【AI系统】计算与调度

计算与调度 上一篇文章我们了解了什么是算子&#xff0c;神经网络模型中由大量的算子来组成&#xff0c;但是算子之间是如何执行的&#xff1f;组成算子的算法逻辑跟具体的硬件指令代码之间的调度是如何配合&#xff1f;这些内容将会在本文进行深入介绍。 计算与调度 计算与…

JavaSE学习心得(APL与算法篇)

常用APL和常见算法 前言 常用APL Math System Runtime Object ​编辑浅克隆 深克隆 Objects Biginteger 构造方法 成员方法 底层存储方式 Bigdecimal 构造方法 Bigdecimal的使用 底层存储方式 ​编辑正则表达式 两个判断练习 两个爬取练习 贪婪爬取和非贪…

C++ ——— 引用的概念以及特性

目录 引用的概念 引用在实际代码中的作用 引用的特性 1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 可以给别名再次取别名&#xff0c;或者多次取别名 4. 引用一旦引用了实体&#xff0c;就不能再引用其他实体了 引用的概念 引用不是新定义一个变量&#x…

Linux-异步IO和存储映射IO

异步IO 在 I/O 多路复用中&#xff0c;进程通过系统调用 select()或 poll()来主动查询文件描述符上是否可以执行 I/O 操作。而在异步 I/O 中&#xff0c;当文件描述符上可以执行 I/O 操作时&#xff0c;进程可以请求内核为自己发送一个信号。之后进程就可以执行任何其它的任务…

嵌入式入门Day23

数据结构Day4 操作受限的线性表栈基本概念顺序栈顺序栈结构创建顺序栈判空和判满栈扩容入栈出栈遍历销毁栈 链式栈队列基本概念顺序队列循环顺序队列定义循环队列的创建循环顺序队列的判空和判满循环顺序队列的入队循环顺序队列的遍历循环顺序队列的出队循环顺序队列的销毁 链式…

C语言实验 一维数组

时间:2024.12.3 一、实验 7-1 交换最小值和最大值 #include<stdio.h> int main() {int n, a[10], i, min = 0, max = 0;scanf("%d", &n);for (i = 0; i < n; i++){scanf("%d",&a[i]);}for (i = 0; i < n; i++){if (a[min] > a[i…

聚合支付系统官方个人免签系统三方支付系统稳定安全高并发

系统采用fastadmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一-些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置对接! 注意&#xff1a;系统没有配置文档很使用教程&#xff0c;不清楚…

HTMLCSS 奇幻森林:小熊的甜蜜蛋糕派对大冒险

这个 HTML 页面包含了一个背景、多个下落的蛋糕图片和一个左右移动的loopy图片,实现了一个小熊吃蛋糕的效果 演示效果 HTML&CSS <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>ideal life</title><style…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码&#xff0c;比如写一个小程序使电脑关机&#xf…

OpenSSL 自建CA 以及颁发证书(网站部署https双向认证)

前言 1、前面写过一篇 阿里云免费ssl证书申请与部署&#xff0c;大家可以去看下 一、openssl 安装说明 1、这部分就不再说了&#xff0c;我使用centos7.9&#xff0c;是自带 openssl的&#xff0c;window的话&#xff0c;要去下载安装 二、CA机构 CA机构&#xff0c;全称为…

在M3上面搭建一套lnmp环境

下载docker-desktop 官网下载docker-desktop 切换镜像源 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docke…

WebSocket 通信说明与基于 ESP-IDF 的 WebSocket 使用

一、 WebSocket 出现的背景 最开始 客户端&#xff08;Client&#xff09; 和 服务器&#xff08;Server&#xff09; 通信使用的是 HTTP 协议&#xff0c;HTTP 协议有一个的缺陷为&#xff1a;通信只能由客户端&#xff08;Client&#xff09;发起。 在一些场景下&#xff0…

linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)

目录 1.安装JDK (非docker)1.1 将文件放在目录下&#xff1a; /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本&#xff0c;按需选择安装2.5 安装docker2.6 启动docker 并 开机…

CODESYS可视化秒表分批计时详细制作案例(一)

#制作一个在可视化界面可用于秒表计时的详细案例# 前言: 在电脑和手机的时钟上,都有一个秒表计时的功能。除此之外,在赛事上,也有更为专业的秒表计时器设备。举一反三,那么对于工控设备,为了衡量生产效率和节拍,引入了"Cycle Time(CT)"的概念,我们可以通…

openGauss开源数据库实战十八

文章目录 任务十八 openGauss逻辑结构:构:用户和权眼管理任务目标实施步骤一、准备工作二、用户和角色管理1.使用CREATE USER语句创建用户2.使用CREATE ROLE语句创建用户3.删除用户和角色 三、权限管理1.系统权限清理工作 任务十八 openGauss逻辑结构:构:用户和权眼管理 任务目…