当前位置: 首页 > news >正文

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

在这里插入图片描述

XML(可扩展标记语言)是一种常用的数据交换格式,它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言,提供了多种方式来处理XML数据。其中,Jsoup 是一个流行的Java库,用于解析和操作XML文档。本篇博客将详细介绍如何使用Java和Jsoup来处理XML数据,无论您是初学者还是有一定经验的开发者,都能受益匪浅。

什么是 Jsoup?

Jsoup 是一个用于解析HTML和XML文档的Java库。尤其在网页抓取、数据提取和文档处理方面非常强大。它提供了一种简单的方式来遍历、搜索和修改文档树,使得XML处理变得非常容易。除了XML,Jsoup还支持HTML5,因此您可以用它来处理网页数据。

安装 Jsoup

要开始使用 Jsoup,您需要将它的库文件添加到您的Java项目中。您可以从 Jsoup 的官方网站上下载最新的jar文件,然后将它添加到您的项目的类路径中。

如果您使用 Maven 作为项目构建工具,只需在您的 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version> <!-- 使用最新的版本 -->
</dependency>

现在,让我们开始使用 Jsoup 来处理 XML 数据。

使用 Jsoup 解析 XML

在这个示例中,我们将使用 Jsoup 来解析一个简单的 XML 文档。我们的 XML 文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore><book><title>Java Programming</title><author>John Doe</author><price>29.99</price></book><book><title>Web Development with Jsoup</title><author>Jane Smith</author><price>19.95</price></book>
</bookstore>

让我们从头开始,首先导入 Jsoup 和其他必要的类:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

然后,我们将加载上面的 XML 文档:

public class XmlParsingExample {public static void main(String[] args) {String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +"<bookstore>" +"    <book>" +"        <title>Java Programming</title>" +"        <author>John Doe</author>" +"        <price>29.99</price>" +"    </book>" +"    <book>" +"        <title>Web Development with Jsoup</title>" +"        <author>Jane Smith</author>" +"        <price>19.95</price>" +"    </book>" +"</bookstore>";Document doc = Jsoup.parse(xml);}
}

现在,doc 包含了整个 XML 文档的内容。我们可以使用 Jsoup 来轻松地遍历和操作这个文档。

获取根元素

要获取根元素,我们可以使用 docselect 方法并传入根元素的标签名,通常是 “bookstore”。

Element rootElement = doc.select("bookstore").first();

获取子元素

要获取子元素,我们可以使用 select 方法并传入子元素的标签名,如 “book”。

Elements bookElements = rootElement.select("book");

获取元素内容

要获取元素的文本内容,我们可以使用 text() 方法。

String title = bookElement.select("title").text();
String author = bookElement.select("author").text();
String price = bookElement.select("price").text();

现在,我们已经成功解析了 XML 数据并提取了相关信息。

使用 Jsoup 修改 XML

除了解析,Jsoup 也允许我们修改 XML 文档。例如,我们可以添加、修改或删除元素。让我们看一个添加新书籍的例子。

假设我们想要添加一本新书到我们的 XML 文档中。首先,我们创建一个新的 Element,设置它的标签名和文本内容:

Element newBook = new Element("book");
newBook.appendChild(new Element("title").text("Data Structures in Java"));
newBook.appendChild(new Element("author").text("Alice Johnson"));
newBook.appendChild(new Element("price").text("24.95"));

然后,我们将这本新书添加到根元素中:

rootElement.appendChild(newBook);

最后,我们可以将整个文档转换为字符串:

String updatedXml = doc.outerHtml();

updatedXml 包含了已更新的 XML 数据。

使用 Jsoup 查询元素

Jsoup 还提供了强大的元素查询功能,允许您根据各种条件来查找和选择元素。这对于从复杂的XML文档中提取特定数据非常有用。以下是一些常用的查询方法:

  • 通过标签名查询元素:

    Elements elements = doc.select("tagname");
    
  • 通过类名查询元素:

    Elements elements = doc.select(".classname");
    
  • 通过属性查询元素:

    Elements elements = doc.select("[attribute=value]");
    
  • 通过多种条件组合查询元素:

    Elements elements = doc.select("tagname.classname[attribute=value]");
    

让我们通过一个示例来演示如何使用 Jsoup 查询元素。假设我们要找到所有价格低于 25 的书籍:

Elements cheapBooks = doc.select("book:has(price:matchesOwn(\\d+\\.\\d+))");

在上述示例中,我们使用 select 方法并传入查询条件 "book:has(price:matchesOwn(\\d+\\.\\d+))"。这个条件的含义是查找标签名为 “book” 的元素,其中包含名为 “price” 的元素,且价格匹配正则表达式 \\d+\\.\\d+,即匹配价格为小数形式的书籍。

然后,我们可以遍历 cheapBooks 集合来获取满足条件的书籍元素,以便进一步处理它们。

使用 Jsoup 处理 HTML

虽然本篇博客主要关注 XML 处理,但是 Jsoup 也是一种出色的 HTML 处理工具。它允许您解析和操作网页,从中提取有用的信息。

以下是一个简单的示例,演示如何使用 Jsoup 解析 HTML 页面并提取页面中的超链接:

import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;public class HtmlParsingExample {public static void main(String[] args) {String url = "https://example.com"; // 替换为您要解析的网页地址try {Document doc = Jsoup.connect(url).get();Elements links = doc.select("a[href]");for (Element link : links) {String href = link.attr("href");String text = link.text();System.out.println("Link: " + text + " (" + href + ")");}} catch (IOException e) {e.printStackTrace();}}
}

在这个示例中,我们使用 Jsoup.connect(url).get() 来下载指定网页的内容,然后使用 select 方法查找所有带有 href 属性的超链接。最后,我们遍历链接并提取链接的文本和 URL。

高级用法

Jsoup 还提供了许多高级功能,允许您进行更复杂的文档操作,包括:

  • 处理表单数据:Jsoup 允许模拟表单提交和处理表单数据。

  • 处理Cookie:您可以设置和处理Cookie来模拟用户会话。

  • 处理文件上传:Jsoup 可以用于上传文件到Web服务器。

  • 处理响应数据:您可以使用 Jsoup 处理来自Web服务器的响应数据,例如处理 JSON 或 XML 数据。

  • 爬取网页:Jsoup 在网页抓取方面非常有用,您可以编写爬虫来提取网站上的信息。

  • 过滤和清理HTML:Jsoup 允许您清理和过滤HTML,以防止跨站脚本攻击。

安全注意事项

当使用 Jsoup 处理来自不受信任源的数据时,请谨慎处理,以防止安全漏洞。Jsoup 有一些防范跨站脚本攻击(XSS)的功能,但您仍然需要小心处理来自用户的数据,以避免潜在的漏洞。

总结

本篇博客介绍了如何使用 Java 和 Jsoup 来解析和处理XML数据。我们了解了如何加载、解析和操作XML文档,以及如何使用查询和选择功能来提取特定元素。此外,我们还提到了如何使用 Jsoup 处理HTML页面,以及一些高级用法和安全注意事项。

无论您是处理XML数据、抓取网页信息还是进行数据清理,Jsoup 都是一个功能强大且易于使用的工具。希望这篇博客对您有所帮助,让您更好地掌握如何在Java中处理XML和HTML数据。如果您有任何问题或需要进一步的指导,请随时提问。祝您在XML和HTML数据处理中取得成功!

作者信息

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

相关文章:

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言&#xff0c;提供了多种方式来处理XML数据。其中&#xff0c;Jsoup 是一个流行的Java库&#xff0c;用于解析和操作XML文…...

QT图形视图框架绘制曲线图和Smith图

QT图形视图框架绘制曲线图和Smith图 QGraphicsView是Qt框架中的一个图形视图部件&#xff0c;用于显示和处理2D图形元素。它提供了强大的工具来创建交互式和自定义的图形应用程序。在绘制折线图和Smith图时&#xff0c;使用QGraphicsView有以下一些优点&#xff1a; 交互性&am…...

0032【Edabit ★☆☆☆☆☆】【每秒帧数】Frames Per Second

0032【Edabit ★☆☆☆☆☆】【每秒帧数】Frames Per Second algorithms language_fundamentals math numbers Instructions Create a function that returns the number of frames shown in a given number of minutes for a certain FPS. Examples frames(1, 1) // 60 fra…...

【LeetCode】1423 可获得的最大点数(中等题)

【题目描述】 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数…...

2024年天津中德应用技术大学专升本物流管理专业课考试大纲

天津中德应用技术大学物流管理专业&#xff08;高职升本科&#xff09;2024年专业基础考试大纲 一、试卷类型 物流管理专业升本专业课考试共1套试卷&#xff0c;总分200分&#xff0c;考试时间为2小时。内容包含仓储与配送管理40%、物流基础30%&#xff0c;运输管理30%&#…...

目标检测YOLO实战应用案例100讲-船舶目标检测及编队识别(续)

目录 3.2.3 分类与回归 3.2.4 网络预设置与训练策略 3.3 实验与分析 3.3.1 实验环境 3.3.2...

【MySQL索引与优化篇】索引的数据结构

文章目录 1. 概述2. 常见索引结构2.1 聚簇索引2.2 二级索引(辅助索引、非聚簇索引)2.3 联合索引 3. InnoDB的B树索引的注意事项3.1 根页面位置万年不动3.2 内节点中目录项记录的唯一性 4. MyISAM中的索引方案5. InnoDB和MyISAM对比6. 小结7. 补充&#xff1a;MySQL数据结构的合…...

Qt Widget 删除之后还会显示 问题

目录 问题描述&#xff1a;Qt QWidget 删除之后还会显示 解决方案&#xff1a; Part1: 使用 deleteLater Part2: 使用 setParent(nullptr) 父控件为空 还有一种不常用的方法 隐藏&#xff1a; 问题描述&#xff1a;Qt QWidget 删除之后还会显示 Qt 无论使用 while (Layo…...

关系型数据库的问题和NoSQL数据库的应用

1.关系型数据库的问题 系统使用通用的商用关系型数据库&#xff0c;系统内部数据采用中央集中方式存储。系统投入使用后&#xff0c;初期用户数量少&#xff0c;系统运行平稳。一段时间后&#xff0c;用户数出现了爆炸式增长&#xff0c;系统暴露出诸多问题&#xff0c;集中表…...

二进制安装k8s

192.168.11.12 master01 192.168.11.12 y4 node01 192.168.11.14 y5 node02 192.168.11.15 对环境进行初始化&#xff0c;主机192.168.11.12、主机y4、主机y5&#xff0c;三台主机都要做以下操作&#xff0c;唯一不同的就是修改主…...

超简洁ubuntu linux 安装 cp2k

文章目录 打开下载网址解压接下来的步骤讲解 将解压的包移到对应路径下最后运行 打开下载网址 需要从github下载&#xff1a;下载网址 两个都可以从windows下先下载&#xff0c;再复制到linux中&#xff0c; 如果不能复制&#xff0c;右键这两个&#xff0c;复制链接&#xf…...

判断日期区间或季节等

使用JavaScript的Date对象来获取当前日期&#xff0c;并通过比较判断是否在指定的日期范围内&#xff08;如3月16日-9月15日&#xff09;。以下是一个示例代码&#xff1a; var currentDate new Date(); // 获取当前日期 var startRange new Date(currentDate.getFullYear()…...

入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql(7)

入门人工智能 —— 学习数据持久化、使用 Python 将数据保存到mysql 什么是数据持久化&#xff1f;使用 Python 进行数据持久化步骤 1: 安装 MySQL步骤 2: 安装必要的 Python 库步骤 3: 连接到 MySQL 数据库步骤 4: 创建数据表步骤 5: 插入数据步骤 6: 查询数据步骤 7: 关闭连接…...

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符&#xff1a;&& , || , &#xff01;4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习&#xff1a;闰年的判断4.5 短路 5. swit…...

交易所(Exchange, ACM/ICPC NEERC 2006, UVa1598)rust解法

你的任务是为交易所设计一个订单处理系统。要求支持以下3种指令。 BUY p q&#xff1a;有人想买&#xff0c;数量为p&#xff0c;价格为q。 SELL p q&#xff1a;有人想卖&#xff0c;数量为p&#xff0c;价格为q。 CANCEL i&#xff1a;取消第i条指令对应的订单&#xff08;输…...

shell_51.Linux获取用户输入_无显示读取,从文件中读取

无显示读取 有时你需要从脚本用户处得到输入&#xff0c;但又不想在屏幕上显示输入信息。典型的例子就是输入密码&#xff0c;但除此之外还有很多种需要隐藏的数据。 -s 选项可以避免在 read 命令中输入的数据出现在屏幕上&#xff08;其实数据还是会被显示&#xff0c;只不过 …...

NOIP2023模拟2联测23 集训

题目大意 给定 n n n个数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1​,a2​,⋯,an​&#xff0c;你需要找到一个集合 S S S&#xff0c;使得 S S S中严格大于 S S S的平均数的数字个数尽量多&#xff0c;输出最多的个数。 注意&#xff1a;这里的集合是可重集&#xff0c;…...

【设计模式】第3节:设计模式概论

设计模式不是代码&#xff0c;而是某类问题的通用方案。设计模式的本质是提高软件的维护性、通用性和扩展性&#xff0c;并降低软件的复杂度。一共有24种设计模式&#xff0c;可以分为创建型模式、结构型模式和行为型模式三大类。设计模式中比较重要的有&#xff1a;单例模式、…...

风力发电功率预测(CEEMDAN-LSTM-CNN-CBAM模型,Python代码)

1.前言 1.1.运行效果&#xff1a;风力发电功率预测&#xff08;CEEMDAN-LSTM-CNN-CBAM模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 1.2.环境库&#xff1a; 如果库版本不一样&#xff0c; 一般也可以运行&#xff0c;这里展示我运行时候的库版本&#xff0c;是…...

精通代码复用:设计原则与最佳实践

精通代码复用&#xff1a;设计原则与最佳实践 在你开始设计的所有层次上&#xff0c;从单一函数、类&#xff0c;到整个库和框架&#xff0c;都需要从一开始就考虑到代码复用。在接下来的文本中&#xff0c;所有这些不同的层次都被称为组件。以下策略将帮助你合理地组织你的代…...

新手避坑指南:给UR机械臂选配RealSense D435相机,这5个参数千万别看错

新手避坑指南&#xff1a;给UR机械臂选配RealSense D435相机&#xff0c;这5个参数千万别看错 第一次为UR机械臂选配深度相机时&#xff0c;我盯着RealSense D435的参数表发呆了半小时——那些专业术语像天书一样。直到项目因选型错误延误两周后&#xff0c;我才明白参数表里藏…...

MAD与标准差:鲁棒统计中的抗噪利器

1. 为什么我们需要抗噪统计量&#xff1f; 在日常数据分析中&#xff0c;我们经常会遇到一些"不听话"的数据点。比如分析员工薪资时突然冒出几个高管的天价年薪&#xff0c;或者测量温度时混入几个明显错误的极端值。这时候如果直接用传统的标准差来计算离散程度&…...

为Jetson AGX添加自定义硬件:手把手编写设备树节点驱动LED与PPS

Jetson AGX硬件扩展实战&#xff1a;从设备树节点到LED与PPS驱动开发 在嵌入式开发领域&#xff0c;Jetson AGX Xavier凭借其强大的计算能力和丰富的接口资源&#xff0c;成为工业控制、机器人视觉等高性能场景的首选平台。但要让这块开发板真正发挥潜力&#xff0c;掌握自定义…...

【人物传记】模拟单片集成电路之父-鲍勃·魏德拉

1 鲍勃魏德拉简介 鲍勃魏德拉&#xff08;Bob Widlar&#xff09; (1937-1991)模拟集成电路的奠基人&#xff0c;以μA702、μA709等开创性设计定义了模拟芯片的规则&#xff0c;用反叛与幽默改写了硅谷的精神&#xff0c;其创造的电流源、带隙基准等技术至今仍运行在每一块芯…...

Gin 框架中的规范响应格式设计与实现

为什么需要统一的响应格式&#xff1f;首先&#xff0c;让我们思考一个问题&#xff1a;为什么要统一API响应格式&#xff1f;前后端协作效率&#xff1a;一致的响应格式让前端开发者能以统一的方式处理服务端响应错误处理简化&#xff1a;标准化的错误码和消息便于统一处理各种…...

Windows下Java网络嗅探实战:jNetPcap配置与HTTP报文捕获详解

Windows下Java网络嗅探实战&#xff1a;jNetPcap配置与HTTP报文捕获详解 网络协议分析一直是开发者探索网络通信底层机制的重要途径。对于Java开发者而言&#xff0c;虽然标准库提供了丰富的网络编程接口&#xff0c;但涉及网络层及以下协议的操作却需要借助第三方库。本文将深…...

ubuntu安装openclaw接入智谱大模型和微信QQ通道配置

前置系统准备 虚拟机安装ubuntu 24.04.3 LTS server版 无需GUI 智谱api注册 注册方式如下 智谱AI 国内版 https://open.bigmodel.cn/ 也可以用我的带邀请 https://www.bigmodel.cn/invite?icodeK2pjkdweVsRYJySj5DADo0jPr3uHog9F4g5tjuOUqno%3D添加apikey https://www.bigm…...

BiliTools:跨平台B站资源管理工具的全方位应用指南

BiliTools&#xff1a;跨平台B站资源管理工具的全方位应用指南 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliToo…...

Wireshark网络协议分析技术与实践指南

1. 网络协议分析技术概述1.1 Wireshark工具简介Wireshark&#xff08;前称Ethereal&#xff09;是目前最主流的开源网络协议分析工具&#xff0c;采用WinPCAP接口直接与网卡进行数据报文交换。该工具支持超过2000种网络协议的解析&#xff0c;能够实时捕获和分析网络数据包。1.…...

【Unity3D】从零打造动态天空盒:Cubemap生成与实时环境映射实战

1. 动态天空盒的核心原理与场景价值 第一次在Unity里看到动态天空盒效果时&#xff0c;我盯着屏幕愣了三秒——云层在头顶流动&#xff0c;夕阳的光影实时投射在建筑表面&#xff0c;整个场景瞬间有了生命力。这种魔法般的体验&#xff0c;其实都建立在立方体贴图&#xff08;C…...