【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…

LeetCode75——Day13

文章目录 一、题目二、题解 一、题目 1679. Max Number of K-Sum Pairs You are given an integer array nums and an integer k. In one operation, you can pick two numbers from the array whose sum equals k and remove them from the array. Return the maximum num…

《向量数据库》——向量数据库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;推送到远程 直接…

Qt判断文件夹路径、文件是否存在不存在则创建

Qt判断文件夹路径、文件是否存在不存在则创建 Chapter1 Qt判断文件夹路径、文件是否存在不存在则创建Qt判断文件夹/目录是否存在Qt判断文件是否存在 Chapter2 Qt 判断文件或文件夹是否存在及创建文件夹1. 判断文件夹是不是存在2. 判断文件是不是存在3、判断文件或文件夹是不是存…

C. Medium Design Codeforces Round 904 (Div. 2)

Problem - C - Codeforces 题目大意&#xff1a;有一个长为m的数组初始全为0&#xff0c;有n个区间[li,ri]&#xff0c;每选择一个区间就要令区间内所有数1&#xff0c;要求选择一些区间&#xff0c;使得数组的最大值-最小值最大&#xff0c;求这个差值 1<n<1e5;1<m…

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

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

Andriod学习笔记(二)

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

JWT——jjwt使用

文章目录 一、JWT是什么&#xff1f;二、JWT构成0、header.payload.signature1、header 头部 (JSON数据&#xff0c;Base64加密)2、payload 载荷 (JSON数据&#xff0c;Base64加密)2.1、Public claims(公共的声明)2.2、Private claims(私人声明)2.3 注意: 3、signature 签名&am…

第六十五章 符号概览

文章目录 第六十五章 符号概览其他形式abcdef{"abc":(def),"abc":(def),"abc":(def)}{abcdef}{%%CLASSNAME}&sql(xxx)[abcdef,abcdef,abcdef]*abcdef?abcdefabcdef 第六十五章 符号概览 其他形式 abcdef ^abcdef "abcdef" 这…

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 …

【RuoYi移动端】uni-app中的单击和双击事件

1、单击事件&#xff1a; click"enterpriseSelect" 2、双击事件&#xff1a; touchend"userinfo"

TypeScript环境安装

一、windows环境 安装node&#xff0c;附带自动安装npm工具 安装tsc npm install -g typescript 对于不支持 Nuget 的项目类型&#xff0c;你可以使用 TypeScript Visual Studio 扩展。 你可以使用 Visual Studio 中的 Extensions > Manage Extensions 安装扩展。 安装下…

第三节——Vue 基础语法

vue语法分为选项是API&#xff08;Option api&#xff09;和组合式api&#xff08;Composition Api&#xff09;,我们以选项式Api入门 一、基本构成 template、script、style三部分构成。template可以理解成编写html的地方&#xff0c;script编写逻辑js的地方&#xff0c;sty…

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

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