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

【Java 进阶篇】Java XML解析:从入门到精通

在这里插入图片描述

XML(可扩展标记语言)是一种常用的数据格式,用于存储和交换数据。在Java中,XML解析是一项重要的任务,它允许您从XML文档中提取和操作数据。本篇博客将从基础开始,详细介绍如何在Java中解析XML文档,包括DOM解析、SAX解析和StAX解析。无论您是XML的新手还是有一些经验的开发者,都能在本文中找到有关Java XML解析的有用信息。

为什么需要XML解析?

XML解析是将XML文档转换为应用程序可以理解和操作的数据的过程。它在许多应用程序中都具有关键作用,包括:

  • 数据交换:XML通常用于不同系统之间的数据交换,解析XML可将接收的数据转化为应用程序可以使用的格式。

  • 配置文件:XML通常用于存储应用程序的配置信息,解析XML可读取配置并将其应用到应用程序中。

  • Web服务:许多Web服务使用XML来传递数据,解析XML可用于访问和操作Web服务的响应数据。

  • 日志文件:某些应用程序将日志数据存储为XML,解析XML可用于分析和提取有关应用程序性能和行为的信息。

XML基础

在开始学习XML解析之前,让我们先了解XML的基础知识。

1. XML文档结构

XML文档由标签(element)、属性(attribute)、文本内容和注释组成。一个简单的XML文档包括以下部分:

<person age="30"><name>John</name><address><city>New York</city><zip>10001</zip></address>
</person>
  • <person> 是一个元素,带有一个名为 age 的属性和子元素 nameaddress
  • <name><address> 也是元素,分别包含文本内容。
  • age<person> 元素的属性。

2. XML解析模型

Java中有几种用于XML解析的模型,主要包括DOM、SAX和StAX。

  • DOM(文档对象模型):DOM解析将整个XML文档加载到内存中,形成一个树状结构,允许您轻松地遍历和操作XML数据。DOM解析适用于小型XML文档,但可能在处理大型文档时占用大量内存。

  • SAX(简单API for XML):SAX解析是事件驱动的,逐行读取XML文档,触发事件来处理元素和数据。SAX解析适用于大型XML文档,因为它不需要将整个文档加载到内存中。

  • StAX(流API for XML):StAX解析是一种双向解析模型,允许您以类似流的方式读取和写入XML数据。它是一种高性能的解析模型,适用于大型文档。

使用DOM解析XML

DOM解析是一种将整个XML文档加载到内存中并构建树状结构的解析方式。它允许您轻松地遍历和操作XML数据。

示例:解析XML文档

让我们通过一个示例来演示如何使用DOM解析XML文档。我们将解析以下XML文档:

<employees><employee><name>John</name><position>Manager</position></employee><employee><name>Alice</name><position>Engineer</position></employee>
</employees>
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;public class DOMParserExample {public static void main(String[] args) {try {// 创建一个DocumentBuilderDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();// 解析XML文件Document document = builder.parse(new File("employees.xml"));// 获取根元素Element root = document.getDocumentElement();// 获取所有employee元素NodeList employeeList = root.getElementsByTagName("employee");for (int i = 0; i < employeeList.getLength(); i++) {Element employee = (Element) employeeList.item(i);// 获取name元素的文本内容String name = employee.getElementsByTagName("name").item(0).getTextContent();// 获取position元素的文本内容String position = employee.getElementsByTagName("position").item(0).getTextContent();System.out.println("Employee Name: " + name);System.out.println("Position: " + position);System.out.println("---------------");}} catch (Exception e) {e.printStackTrace();}}
}

在上述示例中,我们使用DocumentBuilderFactory创建一个DocumentBuilder,然后使用builder.parse()方法解析XML文件。接下来,我们获取根元素employees,并遍历所有employee元素,提取nameposition元素的文本内容。

示例:创建XML文档

DOM解析还允许您创建XML文档。以下是一个示例,演示如何使用DOM创建XML文档:

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;public class DOMCreateExample {public static void main(String[] args) {try {// 创建一个DocumentBuilderDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();// 创建一个新文档Document document = builder.newDocument();// 创建根元素Element employees = document.createElement("employees");document.appendChild(employees);// 创建第一个employee元素Element employee1 = document.createElement("employee");employees.appendChild(employee1);Element name1 = document.createElement("name");name1.appendChild(document.createTextNode("John"));employee1.appendChild(name1);Element position1 = document.createElement("position");position1.appendChild(document.createTextNode("Manager"));employee1.appendChild(position1);// 创建第二个employee元素Element employee2 = document.createElement("employee");employees.appendChild(employee2);Element name2 = document.createElement("name");name2.appendChild(document.createTextNode("Alice"));employee2.appendChild(name2);Element position2 = document.createElement("position");position2.appendChild(document.createTextNode("Engineer"));employee2.appendChild(position2);// 将文档写入文件TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();DOMSource source = new DOMSource(document);StreamResult result = new StreamResult(new File("new_employees.xml"));transformer.transform(source, result);System.out.println("XML文档创建成功!");} catch (Exception e) {e.printStackTrace();}}
}

在上述示例中,我们创建了一个新的Document对象,并使用createElement方法创建元素。然后,我们将元素添加到文档中,最后使用Transformer将文档写入文件。这将创建一个新的XML文档。

使用SAX解析XML

SAX解析是一种基于事件的解析模型,逐行读取XML文档并触发事件来处理元素和数据。相比DOM,SAX解析不需要将整个文档加载到内存中,因此适用于大型XML文档。

示例:解析XML文档

让我们通过一个示例来演示如何使用SAX解析XML文档:

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import java.io.*;public class SAXParserExample {public static void main(String[] args) {try {// 创建一个SAXParserSAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();// 创建一个处理器DefaultHandler handler = new DefaultHandler() {private boolean inEmployee = false;private String name = null;private String position = null;public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if (qName.equalsIgnoreCase("employee")) {inEmployee = true;}}public void endElement(String uri, String localName, String qName) throws SAXException {if (qName.equalsIgnoreCase("employee")) {inEmployee = false;System.out.println("Employee Name: " + name);System.out.println("Position: " + position);System.out.println("---------------");}}public void characters(char[] ch, int start, int length) throws SAXException {if (inEmployee) {String data = new String(ch, start, length);if (name == null) {name = data;} else {position = data;}}}};// 解析XML文件parser.parse(new File("employees.xml"), handler);} catch (Exception e) {e.printStackTrace();}}
}

在上述示例中,我们创建了一个SAXParser和一个事件处理器DefaultHandler。事件处理器在遇到元素的开始和结束以及字符数据时触发事件。我们实现了startElementendElementcharacters方法,以处理相应的事件。

示例:使用SAX解析器工厂

SAX解析也可以使用解析器工厂来创建解析器。以下是一个示例:

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;public class SAXParserFactoryExample {public static void main(String[] args) {try {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();DefaultHandler handler = new DefaultHandler() {// 与前面的示例相同};parser.parse(new File("employees.xml"), handler);} catch (Exception e) {e.printStackTrace();}}
}

这个示例与之前的示例相似,但它使用了解析器工厂来创建SAX解析器。

使用StAX解析XML

StAX解析是一种基于流的解析模型,允许您以类似流的方式逐行读取和写入XML数据。StAX解析是一种高性能的解析模型,适用于大型XML文档。

示例:解析XML文档

让我们通过一个示例来演示如何使用StAX解析XML文档:

import javax.xml.stream.*;
import java.io.*;public class StAXParserExample {public static void main(String[] args) {try {XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("employees.xml"));String currentElement = "";String name = "";String position = "";while (reader.hasNext()) {int event = reader.next();switch (event) {case XMLStreamConstants.START_ELEMENT:currentElement = reader.getLocalName();break;case XMLStreamConstants.CHARACTERS:String data = reader.getText();if ("name".equals(currentElement)) {name = data;} else if ("position".equals(currentElement)) {position = data;}break;case XMLStreamConstants.END_ELEMENT:if ("employee".equals(reader.getLocalName())) {System.out.println("Employee Name: " + name);System.out.println("Position: " + position);System.out.println("---------------");}break;}}reader.close();} catch (Exception e) {e.printStackTrace();}}
}

在上述示例中,我们使用XMLInputFactory创建一个XMLStreamReader,然后使用while循环逐行读取XML文档中的数据。我们跟踪当前元素的名称,并根据当前元素的内容提取nameposition的值。最后,我们在遇到</employee>元素时打印员工信息。

示例:使用StAX写入XML

StAX不仅可以用于解析XML,还可以用于创建XML文档。以下是一个示例,演示如何使用StAX创建XML文档:

import javax.xml.stream.*;
import java.io.*;public class StAXCreateExample {public static void main(String[] args) {try {XMLOutputFactory factory = XMLOutputFactory.newInstance();XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter("new_employees.xml"));writer.writeStartDocument();writer.writeStartElement("employees");// 创建第一个employee元素writer.writeStartElement("employee");writer.writeStartElement("name");writer.writeCharacters("John");writer.writeEndElement();writer.writeStartElement("position");writer.writeCharacters("Manager");writer.writeEndElement();writer.writeEndElement();// 创建第二个employee元素writer.writeStartElement("employee");writer.writeStartElement("name");writer.writeCharacters("Alice");writer.writeEndElement();writer.writeStartElement("position");writer.writeCharacters("Engineer");writer.writeEndElement();writer.writeEndElement();writer.writeEndElement();writer.writeEndDocument();writer.close();System.out.println("XML文档创建成功!");} catch (Exception e) {e.printStackTrace();}}
}

在上述示例中,我们使用XMLOutputFactory创建一个XMLStreamWriter,然后使用write方法逐步创建XML文档。我们首先写入文档声明,然后创建根元素employees,并添加两个employee元素,每个元素都包含nameposition元素。

选择合适的解析方法

在选择XML解析方法时,需要考虑以下因素:

  • 内存消耗:DOM解析通常需要将整个文档加载到内存中,可能导致内存消耗过大。SAX和StAX解析逐行读取文档,内存消耗较低。

  • 性能:SAX和StAX解析通常比DOM解析更快,尤其是在处理大型文档时。

  • 复杂性:DOM解析通常更容易编写,因为它允许您轻松地遍历和操作文档。SAX和StAX解析更复杂,因为您需要编写事件处理器来处理元素和数据。

  • 灵活性:如果您需要读取和写入XML,StAX解析是一种更灵活的选择,因为它支持双向操作。

根据您的具体需求,选择合适的解析方法非常重要。如果您需要处理小型文档并且希望方便地操作数据,DOM解析可能是不错的选择。如果您需要处理大型文档或需要更高的性能,SAX或StAX解析可能更适合。

XML解析库

Java提供了许多XML解析库,用于简化XML解析的过程。一些常见的XML解析库包括:

  • JDOM:JDOM是一种用于解析和操作XML的流行库,提供了简单的API。

  • DOM4J:DOM4J是一个基于DOM的XML解析库,具有强大的功能和性能。

  • Jsoup:Jsoup是一种用于解析HTML和XML的库,通常用于Web抓取和数据提取。

  • Jackson:Jackson是一个处理JSON的库,但也可以用于处理XML。

这些库提供了不同的功能和性能特点,您可以根据自己的需求选择最合适的库。

使用XML Schema验证

除了解析XML,还可以使用XML Schema(XSD)来验证XML文档的有效性。XML Schema定义了XML文档的结构和数据类型,可以确保文档符合规定的结构。

以下是一个使用XSD验证XML的示例:

import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;public class XsdValidatorExample {public static void main(String[] args) {try {String xmlFile = "employees.xml";String xsdFile = "employees.xsd";SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);Schema schema = factory.newSchema(new File(xsdFile));Validator validator = schema.newValidator();Source source = new StreamSource(new File(xmlFile));validator.validate(source);System.out.println("XML验证通过!");} catch (SAXException | IOException e) {System.out.println("XML验证错误: " + e.getMessage());}}
}

在上述示例中,我们使用SchemaFactory创建一个Schema对象,该对象包含了我们之前定义的XSD约束。然后,我们使用Validator来验证XML文档。如果XML文档不符合XSD的约束,将抛出相应的错误。

实际应用示例

让我们来看一个实际的应用示例:使用XML解析来处理Web服务的响应。假设您正在开发一个应用程序,通过调用Web服务来获取数据。 Web服务通常以XML形式返回数据,您可以使用XML解析来提取和处理Web服务的响应。

import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class WebServiceExample {public static void main(String[] args) {// 假设这是Web服务的响应XMLString responseXml = "<data><item>Item 1</item><item>Item 2</item></data>";try {// 创建一个DocumentBuilderDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();// 解析Web服务的响应XMLDocument document = builder.parse(new InputSource(new StringReader(responseXml)));// 获取根元素Node root = document.getDocumentElement();// 获取所有item元素NodeList itemList = root.getChildNodes();for (int i = 0; i < itemList.getLength(); i++) {Node itemNode = itemList.item(i);if (itemNode.getNodeType() == Node.ELEMENT_NODE) {String item = itemNode.getTextContent();System.out.println("Item: " + item);}}} catch (Exception e) {e.printStackTrace();}}
}

在这个示例中,我们模拟了Web服务的响应XML,并使用DOM解析来提取item元素的文本内容。这可以在实际应用程序中用于处理Web服务的响应数据,提取所需的信息。

总结

本博客详细介绍了Java中的XML解析,包括DOM、SAX和StAX三种解析模型。您可以根据项目的需求选择最合适的解析方式。此外,我们还了解了如何使用XML Schema验证XML文档的有效性,以及一些常见的XML解析库。

XML解析是Java开发中常见的任务,它允许您与其他系统交换数据,读取和写入配置文件,访问Web服务的响应数据等。熟练掌握XML解析是Java开发中的一项重要技能。

希望本博客对您有所帮助,如果您有任何问题或需要进一步的指导,请随时提问。祝您在Java XML解析的学习和应用中取得成功!

作者信息

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

相关文章:

【Java 进阶篇】Java XML解析:从入门到精通

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据格式&#xff0c;用于存储和交换数据。在Java中&#xff0c;XML解析是一项重要的任务&#xff0c;它允许您从XML文档中提取和操作数据。本篇博客将从基础开始&#xff0c;详细介绍如何在Java中解析XML文档&#xff0…...

【图像配准】Canny边缘检测+模板配准红外可见光双路数据

研究目的 最近在做无人机遥感红外和可见光双路数据配准&#xff0c;由于红外相机视野范围较小&#xff0c;因此配准的目的主要是在可见光的视野范围内&#xff0c;裁剪出红外图像对应的部分&#xff0c;同时&#xff0c;保持可见光的高分辨率不变。 本文思路 本文尝试使用Ca…...

关于单机流程编排技术——docker compose安装使用的问题

最近在学习docker相关的东西&#xff0c;当我在docker上部署了一个nest应用&#xff0c;其中该应用中依赖了一个基于mysql镜像的容器&#xff0c;一个基于redis镜像的容器。那我&#xff0c;当我进行部署上线时&#xff0c;在启动nest容器时&#xff0c;必须保证redis容器和mys…...

Google Chrome的新“IP保护”功能将隐藏用户的IP地址

导语&#xff1a;在保护用户隐私方面&#xff0c;Google Chrome正在测试一项名为“IP保护”的新功能。通过使用代理服务器掩盖用户的IP地址&#xff0c;这项功能能够增强用户的隐私保护。在意识到IP地址可能被用于秘密追踪后&#xff0c;Google希望在确保用户隐私的同时&#x…...

做机器视觉工程师,苏州德创能不能去工作?

每一家公司都有自身特点&#xff0c;同时也每一家都有自身的bug。 苏州德创作为美国康耐视Cognex产品在华东最大的代理商&#xff0c;也是康耐视外包团队。那么苏州德创有哪些业务构成&#xff0c;业务的构成也是其招聘的主要人员的方向。 设备视觉供应商&#xff0c;如卓越&…...

交换机基础(二):VLAN 基础知识

一、VLAN 基础知识 虚拟局域网 (Virtual Local Area Network,VLAN) 是一种将局域网设 备从逻辑上划分成一个个网段&#xff0c;从而实现虚拟工作组的数据交换技术。 这一技术主要应用于3层交换机和路由器中&#xff0c;但主流应用还是在3层交换机中。 VLAN 是基于物理网络上构建…...

一个基于Vue3搭建的低代码数据可视化开发平台

JNPF是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 在JNPF中&#xff0c;至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端UI等组件&#xff0c;这种情况下我们避免了重…...

经验风险最小化与结构风险最小化:优化机器学习模型的两种方法

随着大数据时代的到来&#xff0c;机器学习在各个领域中的应用越来越广泛。然而&#xff0c;在构建机器学习模型时&#xff0c;我们面临着两个主要的挑战&#xff1a;经验风险最小化和结构风险最小化。本文将深入探讨这两种方法&#xff0c;并分析它们在优化机器学习模型中的作…...

Java泛型中的问号是什么意思

通配符概念 因为 List 是泛型类&#xff0c;为了 表示各种泛型 List 的父类&#xff0c;可以使用类型通配符&#xff0c;类型通配符使用问号(?)表示&#xff0c;将一个问号当做类型元素传递个 List&#xff0c;可以表示为 List<?>,意思是 元素类型未知的 List&#xf…...

粤嵌实训医疗项目day02(Vue + SpringBoot)

目录 一、创建vue项目并运行 二、vue-cli中的路由使用 三、element-ui框架、实现页面布局以及vue-路由 四、前端登录页面 五、user登录后端接口完善【后端】 六、user登录前端-请求工具-请求发起【前端】 七、请求的跨域-访问策略 八、完善项目的页面布局、导航菜单以及…...

又是一年1024程序员日

程序员节是每年的10月24日&#xff0c;这是一个特殊的节日&#xff0c;旨在庆祝和表彰程序员们对科技和社会的贡献。作为技术领域的从业者&#xff0c;程序员们在现代社会中扮演着重要的角色&#xff0c;他们致力于编写、测试和维护软件代码&#xff0c;为我们的生活带来了无数…...

acme.sh签发和部署ZeroSSL泛域名证书

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 介绍 acme.sh 是个开源的shell证书生成脚本&#xff0c;他可以自动生成Let’s Encrypt 的证书…...

Calibre拾遗:FDI (Foreign Database Interface)系统简介

Calibre是强大的GDS处理工具&#xff0c;包括查看&#xff0c;验证&#xff0c;分析等操作&#xff0c;操作由浅入深&#xff0c;除过手动编辑GDS的不是很灵活外&#xff0c;其他各种命令和操作策略&#xff0c;都是远&#xff08;遥&#xff09;远&#xff08;遥&#xff09;走…...

记一次渗透测试事件

一、漏洞发现 拿到登录的接口&#xff0c;丢到sqlmap里面跑一把&#xff0c;发现延时注入 进一步查询&#xff0c;发现是sa权限&#xff0c;直接os-shell whomai查询发现是管理员权限 os-shell执行命令太慢了&#xff0c;直接进行nc 反弹 执行base64 加密后的powershell命令&…...

AIGC笔记--基于DDPM实现图片生成

目录 1--扩散模型 2--训练过程 3--损失函数 4--生成过程 5--参考 1--扩散模型 完整代码&#xff1a;ljf69/DDPM 扩散模型包含两个过程&#xff0c;前向扩散过程和反向生成过程。 前向扩散过程对一张图像逐渐添加高斯噪声&#xff0c;直至图像变为随机噪声。 反向生成过程…...

三十七、【进阶】SQL的explain

1、explain 2、基础使用 在使用explain关键字时&#xff0c;只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…...

【Python】取火柴小游戏(巴什博弈)

火柴游戏&#xff1a;Python编程示例 当我们想要玩一个简单而有趣的游戏&#xff0c;同时又想锻炼自己的编程技能时&#xff0c;一个经典的选择就是火柴游戏。这个游戏的规则很简单&#xff1a;有一堆火柴&#xff0c;每次可以拿走1到6根&#xff0c;两名玩家轮流取火柴&#…...

030-第三代软件开发-密码输入框

第三代软件开发-密码输入框 文章目录 第三代软件开发-密码输入框项目介绍密码输入框总结一下 关键字&#xff1a; Qt、 Qml、 echoMode、 TextInput、 Image 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language…...

mysql读取文件

环境地址&#xff1a;phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY 参考文章&#xff1a; mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客 从一道ctf题学习mysql任意文件读取漏洞 - 安全客&#xff0c;安全资讯平台 MYSQL 任意文件读取 小组CTF出题感想 - …...

CentOS(5)——rpm包和源码包区别

目录 一、简介 二、区别 ①包名称 ②概念 ③优缺点 ④安装位置的区别 ⑤安装位置不同带来的影响 ⑥卸载方式的不同 一、简介 最近在公司内网离线升级Git时&#xff0c;遇见两个概念&#xff0c;分别是使用rpm包安装git&#xff0c;另一个这是编译源码包安装git&#x…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...