【Java 进阶篇】Java XML快速入门:理解、解析和生成XML

在这里插入图片描述

XML(可扩展标记语言)是一种常用于存储和交换数据的标记语言,而Java是一种强大的编程语言,它具有处理XML的能力。在本篇博客中,我们将探讨XML的基础知识,学习如何在Java中解析和生成XML文档,以及实际应用中如何处理XML数据。

什么是XML?

XML是一种标记语言,用于描述和存储数据。它的设计目标是可读性强、自解释、可扩展性好。XML文档包含标签、元素和属性,用于组织和描述数据。

XML的主要特点包括:

  • 自解释性:XML文档通常包含有关数据的描述,标签和元素名称通常清晰表达数据的含义,使其易于理解。

  • 层次性:XML数据以层次结构的方式组织,可以包含嵌套元素,形成父子关系,非常适合表示树状结构的数据。

  • 可扩展性:用户可以自定义标签和规则,因此XML适用于各种领域,从配置文件到数据交换。

  • 与平台无关:XML是一种与编程语言和操作系统无关的格式,因此可以在不同平台上读取和解析XML数据。

Java中的XML处理

Java提供了丰富的工具和库来处理XML数据。主要的XML处理任务包括:

  1. 解析XML:将XML文档解析为Java对象,以便在应用程序中进行处理。
  2. 生成XML:将Java对象转换为XML文档,以便将数据存储为XML格式。
  3. 操作XML:对已解析的XML文档进行增、删、改、查等操作。

接下来,我们将详细讨论如何在Java中执行这些任务。

解析XML

解析XML是将XML文档转换为Java对象的过程。Java提供了多种解析XML的方法,其中两种主要的是DOM解析和SAX解析。

DOM解析

DOM(文档对象模型)解析将整个XML文档加载到内存中,创建一个树状结构的文档对象模型。这种方式允许您以面向对象的方式访问和操作XML文档,但需要占用大量内存,因此不适合处理大型XML文件。

以下是一个使用DOM解析XML的示例:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;public class DomParserExample {public static void main(String[] args) {try {File inputFile = new File("books.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(inputFile);doc.getDocumentElement().normalize();NodeList bookList = doc.getElementsByTagName("book");for (int temp = 0; temp < bookList.getLength(); temp++) {Node nNode = bookList.item(temp);if (nNode.getNodeType() == Node.ELEMENT_NODE) {Element eElement = (Element) nNode;System.out.println("Title: " + eElement.getElementsByTagName("title").item(0).getTextContent());System.out.println("Author: " + eElement.getElementsByTagName("author").item(0).getTextContent());System.out.println("Price: " + eElement.getElementsByTagName("price").item(0).getTextContent());}}} catch (Exception e) {e.printStackTrace();}}
}

在上面的示例中,我们使用DOM解析读取XML文件中的书籍信息。

SAX解析

SAX(简单API for XML)解析是一种事件驱动的解析方式,它逐行读取XML文档,触发事件来处理不同部分的数据。相比DOM,SAX解析占用较少内存,因此适合处理大型XML文件。

以下是一个使用SAX解析XML的示例:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
import java.io.*;public class SaxParserExample {public static void main(String[] args) {try {File inputFile = new File("books.xml");SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser saxParser = factory.newSAXParser();DefaultHandler handler = new DefaultHandler() {boolean bTitle = false;boolean bAuthor = false;boolean bPrice = false;public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if (qName.equalsIgnoreCase("title")) {bTitle = true;}if (qName.equalsIgnoreCase("author")) {bAuthor = true;}if (qName.equalsIgnoreCase("price")) {bPrice = true;}}public void characters(char ch[], int start, int length) throws SAXException {if (bTitle) {System.out.println("Title: " + new String(ch, start, length));bTitle = false;}if (bAuthor) {System.out.println("Author: " + new String(ch, start, length));bAuthor = false;}if (bPrice) {System.out.println("Price: " + new String(ch, start, length));bPrice = false;}}};saxParser.parse(inputFile, handler);} catch (Exception e) {e.printStackTrace();}}
}

在上面的示例中,我们使用SAX解析读取XML文件中的书籍信息。

生成XML

生成XML是将Java对象转换为XML文档的过程。Java提供了多种方式来生成XML,其中一种常用的方式是使用DOM库。

以下是一个使用DOM库生成XML的示例:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;public class DomXmlWriterExample {public static void main(String[] args) {try {DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.newDocument();// 创建根元素Element rootElement = doc.createElement("bookstore");doc.appendChild(rootElement);// 创建书籍元素Element bookElement = doc.createElement("book");rootElement.appendChild(bookElement);// 创建标题元素Element titleElement = doc.createElement("title");titleElement.appendChild(doc.createTextNode("Java编程入门"));bookElement.appendChild(titleElement);// 创建作者元素Element authorElement = doc.createElement("author");authorElement.appendChild(doc.createTextNode("小明"));bookElement.appendChild(authorElement);// 创建价格元素Element priceElement = doc.createElement("price");priceElement.appendChild(doc.createTextNode("29.99"));bookElement.appendChild(priceElement);// 将文档写入XML文件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);System.out.println("XML文件已生成!");} catch (Exception e) {e.printStackTrace();}}
}

在上面的示例中,我们创建了一个新的XML文档,并使用DOM库构建XML结构,然后将文档写入名为 “new_books.xml” 的文件。

操作XML

除了解析和生成XML,Java还提供了操作XML文档的能力。您可以使用DOM或其他库来遍历、修改和查询XML数据。

以下是一个使用DOM库操作XML的示例:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;public class DomXmlModifierExample {public static void main(String[] args) {try {File inputFile = new File("books.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(inputFile);doc.getDocumentElement().normalize();// 获取根元素Element root = doc.getDocumentElement();// 添加新书籍Element newBook = doc.createElement("book");Element title = doc.createElement("title");title.appendChild(doc.createTextNode("新书标题"));Element author = doc.createElement("author");author.appendChild(doc.createTextNode("新书作者"));Element price = doc.createElement("price");price.appendChild(doc.createTextNode("19.99"));newBook.appendChild(title);newBook.appendChild(author);newBook.appendChild(price);root.appendChild(newBook);// 修改现有书籍NodeList bookList = doc.getElementsByTagName("book");for (int temp = 0; temp < bookList.getLength(); temp++) {Node bookNode = bookList.item(temp);if (bookNode.getNodeType() == Node.ELEMENT_NODE) {Element bookElement = (Element) bookNode;if (bookElement.getElementsByTagName("title").item(0).getTextContent().equals("Java编程入门")) {Element newPrice = doc.createElement("price");newPrice.appendChild(doc.createTextNode("25.00"));bookElement.appendChild(newPrice);}}}// 删除书籍NodeList bookListToRemove = doc.getElementsByTagName("book");for (int temp = 0; temp < bookListToRemove.getLength(); temp++) {Node bookNode = bookListToRemove.item(temp);if (bookNode.getNodeType() == Node.ELEMENT_NODE) {Element bookElement = (Element) bookNode;if (bookElement.getElementsByTagName("title").item(0).getTextContent().equals("新书标题")) {root.removeChild(bookNode);}}}// 将文档写回XML文件TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();DOMSource source = new DOMSource(doc);StreamResult result = new StreamResult(new File("modified_books.xml"));transformer.transform(source, result);System.out.println("XML文件已修改!");} catch (Exception e) {e.printStackTrace();}}
}

在上面的示例中,我们打开一个XML文件,然后添加新书籍、修改现有书籍和删除书籍,最后将文档写回到XML文件中。

实际应用示例

让我们来看一个实际的应用示例:使用Java解析RSS订阅。RSS是一种常见的数据格式,用于发布博客文章、新闻等内容。我们可以使用Java解析并显示RSS订阅中的文章标题和链接。

首先,创建一个RSS订阅文件 rss_feed.xml,并添加一些文章项:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>示例RSS订阅</title><link>http://example.com/rss</link><description>这是一个示例RSS订阅</description><item><title>文章1标题</title><link>http://example.com/article1</link></item><item><title>文章2标题</title><link>http://example.com/article2</link></item></channel>
</rss>

接下来,我们可以编写Java代码来解析并显示RSS订阅的文章:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;public class RssReaderExample {public static void main(String[] args) {try {File inputFile = new File("rss_feed.xml");DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();Document doc = dBuilder.parse(inputFile);doc.getDocumentElement().normalize();Element channel = (Element) doc.getElementsByTagName("channel").item(0);System.out.println("订阅标题: " + channel.getElementsByTagName("title").item(0).getTextContent());System.out.println("订阅链接: " + channel.getElementsByTagName("link").item(0).getTextContent());System.out.println("订阅描述: " + channel.getElementsByTagName("description").item(0).getTextContent());System.out.println("文章列表:");NodeList items = doc.getElementsByTagName("item");for (int i = 0; i < items.getLength(); i++) {Element item = (Element) items.item(i);System.out.println("标题: " + item.getElementsByTagName("title").item(0).getTextContent());System.out.println("链接: " + item.getElementsByTagName("link").item(0).getTextContent());System.out.println("---------------");}} catch (Exception e) {e.printStackTrace();}}
}

在上面的示例中,我们解析了一个包含文章标题和链接的RSS订阅文件,并将这些信息显示在控制台上。

总结

本篇博客介绍了XML的基础知识,以及如何在Java中解析和生成XML文档。我们了解了两种常见的XML解析方法:DOM解析和SAX解析,以及如何使用DOM库操作XML文档。我们还探讨了一个实际应用示例,演示了如何使用Java解析RSS订阅。

XML在数据交换、配置文件、Web服务和许多其他领域中都有广泛的应用。掌握XML处理技术对于Java开发人员来说非常重要,因为它允许他们有效地处理和交换数据。希望本篇博客对您理解Java中的XML处理提供了有用的信息,使您能够在自己的项目中应用这些知识。无论您是初学者还是有经验的开发人员,都可以从中受益,掌握XML处理的基本技能。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

springboot 程序设计优雅退出

一 springboot优雅退出 1.1 概述 在springboot2.3版本后&#xff0c;实现了优雅退出功能。当server.shutdowngraceful启用时&#xff0c;在 web 容器关闭时&#xff0c;web 服务器将不再接收新请求&#xff0c;并将剩余活动执行完成给设置一个缓冲期。缓冲期 timeout-per-shu…

《向量数据库》——向量数据库Milvus Cloud 和Dify比较

Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈&#xff0c;在此前已支持丰富多元的大型语言模型的接入&#xff0c;除了 OpenAI、Anthropic、Azure OpenAI、Hugging face、Replicate 等全球顶尖模型及模型托管平台&#xff0c;也完成了国内主流的各大模型支持&#…

pycharm操作git、前后端项目上传到gitee

pycharm操作git 之前用命令做的所有操作&#xff0c;使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址&#xff08;http、ssh&#xff09; 提交到暂存区&#xff0c;提交到版本库&#xff0c;推送到远程 直接…

初始Redis 分布式结构的发展演变

目录 Redis的特点和使用场景 分布式系统的引入 单机系统 分布式系统 应用服务器的增多&#xff08;处理更多的请求&#xff09; 数据库读写分离&#xff08;数据服务器的增多) 引入缓存 应对更大的数据量 业务拆分&#xff1a;微服务 Redis的特点和使用场景 我们先来…

Andriod学习笔记(二)

页面设计的零碎知识 通用属性设置文本大小设置视图宽高设置视图的对齐方式 页面布局LinearLayoutRelativeLayoutGridLayoutScollView 按钮触控ButtonImageViewImageButton 通用属性 设置文本大小 纯数字的setTextSize方法&#xff0c;内部默认字体单位为sp&#xff0c;sp是An…

YOLOv7-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv7模型训练1. 项目的克隆和必要的环境依赖1.1 项目的克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改模型配置文件3.2 修改数据配置文件3.3 训练模型3.4 mAP测试 三、…

[Spring] SpringBoot2 简介(一)—— 基础配置

目录 一、SpringBoot 简介 1、Spring 的缺点 2、SpringBoot 功能 二、SpringBoot 入门案例 1、实现步骤 2、访问服务器 3、入门小结 4、Idea 快速构建 SpringBoot 工程 5、起步依赖无需版本号 6、主启动类的在项目中的位置&#xff08;*重要*&#xff09; 三、Sprin…

【小白专用 已验证】PHP连接SQLServer数据库

PHP是一门强大的服务器端脚本语言&#xff0c;而SQL Server是Microsoft开发的一款关系型数据库管理系统。为了在PHP中直接操纵SQL Server数据库&#xff0c;需要通过安装SQL Server扩展来实现。这篇文章将详细介绍如何在PHP中使用SQL Server扩展来操作数据库。 首先&#xff0…

链表的中间结点-力扣

1、题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海…

使用 Rust 和 cURL 库下载程序

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; ​ use std::io::{self, Read}; use std::error::Error; ​ fn main() {let url "https://www.baidu.com";let …

USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式

连接计算机外围设备最简单的方法是通过USB(通用串行总线)。USB是即插即用接口&#xff0c;可以将扫描仪、打印机、数码相机、闪存驱动器等计算机外围设备连接到计算机上。本篇文章就来介绍一下USB的一些基础知识&#xff0c;包括。 文章目录 1 接口类型和标准规范2 引脚分布3 …

centos如何根据端口号查询程序路径

centos如何根据端口号查询程序路径 如果是半路接受的应用&#xff0c;上个人只给你说了程序的端口号&#xff0c;别的都没&#xff0c;那怎么找程序的路径哪&#xff1f;一是给上上个人要&#xff0c;二是自己找&#xff08;我是自己找的&#xff09; 小白教程&#xff0c;一…

【计网 DNS】计算机网络 DNS协议详解:中科大郑烇老师笔记 (六)

目录 0 引言1 DNS概述1.1 定义1.2 DNS域名结构1.2 域名解析步骤 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计算机网络&#xff08;一&#xff09;、计算机网络&…

分享一下我家网络机柜,家庭网络设备推荐

家里网络机柜搞了几天终于搞好了&#xff0c;非专业的&#xff0c;走线有点乱&#xff0c;勿喷。 从上到下的设备分别是&#xff1a; 无线路由器&#xff08;当ap用&#xff09;:TL-XDR6088 插排&#xff1a;德木pdu机柜插排 硬盘录像机&#xff1a;TL-NVR6108-L8P 第二排左边…

【Spring Cloud Alibaba】seata分布式事务官方入门案例(实战版)

文章目录 1. 业务介绍1.1. 用例1.2. 架构图1.3. 3个服务的代码及业务逻辑&#xff08;略&#xff09; 2. SEATA 的分布式交易解决方案3. 由Dubbo SEATA提供支持的示例&#xff08;实战&#xff09;3.1. 步骤 1&#xff1a;建立数据库&#xff0c;如seata数据库3.2. 步骤 2&…

2023高频前端面试题(含答案)

一、简单页面1、CSS选择器样式优先级2、CSS实现三列布局&#xff08;左右固定宽度&#xff0c;中间自适应&#xff09; &#xff08;1&#xff09;CSS浮动 第一个float:left&#xff0c;第二个float:right&#xff0c;第三个设置margin-left和margin-right &#xff08;2&#…

无纸化办公小程序数据交互、wxs的使用

前言 很多同志们再写小程序的过程中&#xff0c;不知道该怎么发起HTTP请求到后端&#xff0c;在Web环境中发起HTTPS请求是很常见的&#xff0c;但是微信小程序是腾讯内部的产品&#xff0c;不能直接打开一个外部的链接。例如&#xff0c;在微信小程序中不能直接打开www.taobao…

ASRPRO语音识别模块

ASRPRO语音识别模块 SOFT IIC 与PCA9685模块通信 pca9685 iic通信 地址位 ADDR<<1|0 左移一位 #define I2C_WRITE 0 #define I2C_READ 1 否则通信地址错误 asrpro 通过UART与电脑连接&#xff0c;可以进行简单的交互 将STM32作为接口扩展&#xff0c;通过SPI或I…

Seata学习

Seata Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网地址&#xff1a;https://seata.io/zh-cn/index.html 为什么会产生分布式事务&#xff1f; 示例&#xff1a;用户下单后需要创建订单&#xff0c;同时…

DDR电源硬件设计要点

一、DDR电源简介 1. 电源 DDR的电源可以分为三类: a、主电源VDD和VDDQ,主电源的要求是VDDQ=VDD,VDDQ是给IO buffer供电的电源,VDD是给但是一般的使用中都是把VDDQ和VDD合成一个电源使用。 有的芯片还有VDDL,是给DLL供电的,也和VDD使用同一电源即可。电源设计时,需要考…