【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3后台管理系统之跨域代理

vite.config.js中 server: {port: 5002,host: true, //0.0.0.0open: false,strictPort: true,proxy: {// 请求前缀/api&#xff0c;只有加了/api前缀的请求才会走代理(前端自定义)/api: {target: http://127.0.0.1:8000,// 获取服务器地址的设置changeOrigin: true,// 路径重写…

H5游戏源码分享-考眼力游戏猜猜金币在哪

H5游戏源码分享-考眼力游戏猜猜金币在哪 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta name"apple-mobile-web-app-capa…

国家网信办发布第十三批境内区块链信息服务备案编号

2019年2月15日《区块链信息服务管理规定》&#xff08;以下简称《管理规定》&#xff09;正式实施以来&#xff0c;国家互联网信息办公室依法依规组织开展备案审核工作&#xff0c;已发布2批次共506个境内区块链信息服务名称及备案编号&#xff0c;近日正式发布第三批共224个境…

若依ruoyi-nbcio如何做一个仿钉钉流程设计器的思考

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 看到有些流程图采用仿钉钉的流程设计&#xff0c;比如下面界面&#xff1a; 这种方式虽然简单&#xff0c…

shell中的运算

目录 1.运算符号 2.运算指令 练习 1.运算符号 运算符号意义加法-减法*乘法/除法%除法后的余数**乘方自加一- -自减一<小于<小于等于>大于>大于等于等于ji ->jji*j*i->jj*i/j/i->jj/i%j%i->jj%i 2.运算指令 (()) //((a12))let //let a12 …

Starknet开发工具

1. 引言 目前Starknet的开发工具流可为&#xff1a; 1&#xff09;Starkli&#xff1a;音为Stark-lie&#xff0c;为替换官方starknet-CLI的快速命令行接口。Starkli为单独的接口&#xff0c;可独自应用&#xff0c;而不是其它工具的组件。若只是想与Starknet交互&#xff0…

《算法通关村—最大小栈问题解析》

《算法通关村—最大小栈问题解析》 最小栈 描述 leetCode 155: 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现最小栈 MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop()…

MVC架构_Qt自己的MV架构

文章目录 前言模型/视图编程1.先写模型2. 视图3. 委托 例子&#xff08;Qt代码&#xff09;例1 查询本机文件系统例2 标准模型项操作例3 自定义模型示例:军事武器模型例4 只读模型操作示例例5 选择模型操作例6 自 定 义委 托(在testSelectionModel上修改) 前言 在Qt中&#xf…

YouTube博主数据信息资源

YouTube博主数据信息资源 &#x1f525;我是一位拥有10年编程经验的程序猿&#xff0c;为你带来一个全新的优质资源 &#x1f50d;您是否在寻找最新、最活跃的YouTube博主数据&#xff0c;以助力你的项目、营销或研究&#xff1f; 我们的数据&#xff0c;您的优势&#xff1a;…

Azure - 机器学习实战:快速训练、部署模型

本文将指导你探索 Azure 机器学习服务的主要功能。在这里&#xff0c;你将学习如何创建、注册并发布模型。此教程旨在让你深入了解 Azure 机器学习的基础知识和常用操作。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验…

97. 交错字符串

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a;动态规划。 如果s1.length()s2.length ! s3.length()&#xff0c;直接返回false&#xff0c;否则使用动态规划求解。定义状态&#xff1a;dp[i][i]&#xff…

STM32F10xx 存储器和总线架构

一、系统架构 在小容量、中容量和大容量产品 中&#xff0c;主系统由以下部分构成&#xff1a; 四个驱动单元 &#xff1a; Cotex-M3内核、DCode总线&#xff08;D-bus&#xff09;和系统总线&#xff08;S-bus&#xff09; 通用DMA1和通用DMA2 四个被动单元 内部SRAM 内部…

TeeChart for .NET 2023.10.19 Crack

TeeChart.NET 的 TeeChart 图表控件提供了一个出色的通用组件套件&#xff0c;可满足无数的图表需求&#xff0c;也针对重要的垂直领域&#xff0c;例如金融、科学和统计领域。 数据可视化 数十种完全可定制的交互式图表类型、地图和仪表指示器&#xff0c;以及完整的功能集&am…

Linux之系统编程

1.yum 1.yum list可以出现所有可下载的程序 辅助grep进行查找 2.yum install可以下载并安装 3.yum remove可以卸载程序 不同的商业操作系统内核都是一样的&#xff0c;主要是配套社区不一样。 开源组织&#xff0c;各大公司&#xff0c;既得利益者。 同上 基础软件源可以保证…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题&#xff08;√&#xff09;二、2021年真题&#xff08;√&#xff09;三、2020年真题&#xff08;√&#xff09;四、2019年真题&#xff08;√&#xff09;五、2018年真题&#xff08;√&#xff09;六、2017年真题&#xff08;√&#xff09;七、201…

[Python]unittest-单元测试

目录 unittest的大致构成: Test Fixture Test Case-测试用例 Test Suite-测试套件 Test Runner 批量执行脚本 makeSuite() TestLoader discover() 用例的执行顺序 忽略用例执行 skip skipIf skipUnless 断言 HTML测试报告 错误截图 unittest是python中的单元测…

《红蓝攻防对抗实战》八.利用OpenSSL对反弹shell流量进行加密

前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网《红蓝攻防对抗实战》四.内网探测协议出网之ICMP协议探测出网《红蓝攻防对抗…

【C++深入浅出】模版初识

目录 一. 前言 二. 泛型编程 三. 函数模版 3.1 函数模版的概念 3.2 函数模版的格式 3.3 函数模版的原理 3.4 函数模板的实例化 3.5 模板参数的匹配原则 四. 类模版 4.1 类模版的定义 4.2 类模版的实例化 一. 前言 本期我们要介绍的是C的又一大重要功能----模版。通…

单例模式详解【2023年最新】

一、单例模式概念 单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。它的目的是限制一个类只能创建一个对象&#xff0c;以确保在整个应用程序中只有一个共享的实例。 单例模式通常用于以下情况&#xff1a;…

git stash的使用方法

git stash的使用方法 应用场景 当我们在开发一个新功能的时候&#xff0c;或者开发到一半&#xff0c;然后就收到了线上master 出现了bug&#xff0c;当分支开发已经进行了或者进行到一半了&#xff0c;这时怎么办呢&#xff1f; 这时解决方案有两种&#xff1a;一种是先先将当…