【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的属性和子元素name和address。<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元素,提取name和position元素的文本内容。
示例:创建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。事件处理器在遇到元素的开始和结束以及字符数据时触发事件。我们实现了startElement、endElement和characters方法,以处理相应的事件。
示例:使用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文档中的数据。我们跟踪当前元素的名称,并根据当前元素的内容提取name和position的值。最后,我们在遇到</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元素,每个元素都包含name和position元素。
选择合适的解析方法
在选择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(可扩展标记语言)是一种常用的数据格式,用于存储和交换数据。在Java中,XML解析是一项重要的任务,它允许您从XML文档中提取和操作数据。本篇博客将从基础开始,详细介绍如何在Java中解析XML文档࿰…...
【图像配准】Canny边缘检测+模板配准红外可见光双路数据
研究目的 最近在做无人机遥感红外和可见光双路数据配准,由于红外相机视野范围较小,因此配准的目的主要是在可见光的视野范围内,裁剪出红外图像对应的部分,同时,保持可见光的高分辨率不变。 本文思路 本文尝试使用Ca…...
关于单机流程编排技术——docker compose安装使用的问题
最近在学习docker相关的东西,当我在docker上部署了一个nest应用,其中该应用中依赖了一个基于mysql镜像的容器,一个基于redis镜像的容器。那我,当我进行部署上线时,在启动nest容器时,必须保证redis容器和mys…...
Google Chrome的新“IP保护”功能将隐藏用户的IP地址
导语:在保护用户隐私方面,Google Chrome正在测试一项名为“IP保护”的新功能。通过使用代理服务器掩盖用户的IP地址,这项功能能够增强用户的隐私保护。在意识到IP地址可能被用于秘密追踪后,Google希望在确保用户隐私的同时&#x…...
做机器视觉工程师,苏州德创能不能去工作?
每一家公司都有自身特点,同时也每一家都有自身的bug。 苏州德创作为美国康耐视Cognex产品在华东最大的代理商,也是康耐视外包团队。那么苏州德创有哪些业务构成,业务的构成也是其招聘的主要人员的方向。 设备视觉供应商,如卓越&…...
交换机基础(二):VLAN 基础知识
一、VLAN 基础知识 虚拟局域网 (Virtual Local Area Network,VLAN) 是一种将局域网设 备从逻辑上划分成一个个网段,从而实现虚拟工作组的数据交换技术。 这一技术主要应用于3层交换机和路由器中,但主流应用还是在3层交换机中。 VLAN 是基于物理网络上构建…...
一个基于Vue3搭建的低代码数据可视化开发平台
JNPF是一个Vue3搭建的低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可完成业务需求。 在JNPF中,至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端UI等组件,这种情况下我们避免了重…...
经验风险最小化与结构风险最小化:优化机器学习模型的两种方法
随着大数据时代的到来,机器学习在各个领域中的应用越来越广泛。然而,在构建机器学习模型时,我们面临着两个主要的挑战:经验风险最小化和结构风险最小化。本文将深入探讨这两种方法,并分析它们在优化机器学习模型中的作…...
Java泛型中的问号是什么意思
通配符概念 因为 List 是泛型类,为了 表示各种泛型 List 的父类,可以使用类型通配符,类型通配符使用问号(?)表示,将一个问号当做类型元素传递个 List,可以表示为 List<?>,意思是 元素类型未知的 List…...
粤嵌实训医疗项目day02(Vue + SpringBoot)
目录 一、创建vue项目并运行 二、vue-cli中的路由使用 三、element-ui框架、实现页面布局以及vue-路由 四、前端登录页面 五、user登录后端接口完善【后端】 六、user登录前端-请求工具-请求发起【前端】 七、请求的跨域-访问策略 八、完善项目的页面布局、导航菜单以及…...
又是一年1024程序员日
程序员节是每年的10月24日,这是一个特殊的节日,旨在庆祝和表彰程序员们对科技和社会的贡献。作为技术领域的从业者,程序员们在现代社会中扮演着重要的角色,他们致力于编写、测试和维护软件代码,为我们的生活带来了无数…...
acme.sh签发和部署ZeroSSL泛域名证书
大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 介绍 acme.sh 是个开源的shell证书生成脚本,他可以自动生成Let’s Encrypt 的证书…...
Calibre拾遗:FDI (Foreign Database Interface)系统简介
Calibre是强大的GDS处理工具,包括查看,验证,分析等操作,操作由浅入深,除过手动编辑GDS的不是很灵活外,其他各种命令和操作策略,都是远(遥)远(遥)走…...
记一次渗透测试事件
一、漏洞发现 拿到登录的接口,丢到sqlmap里面跑一把,发现延时注入 进一步查询,发现是sa权限,直接os-shell whomai查询发现是管理员权限 os-shell执行命令太慢了,直接进行nc 反弹 执行base64 加密后的powershell命令&…...
AIGC笔记--基于DDPM实现图片生成
目录 1--扩散模型 2--训练过程 3--损失函数 4--生成过程 5--参考 1--扩散模型 完整代码:ljf69/DDPM 扩散模型包含两个过程,前向扩散过程和反向生成过程。 前向扩散过程对一张图像逐渐添加高斯噪声,直至图像变为随机噪声。 反向生成过程…...
三十七、【进阶】SQL的explain
1、explain 2、基础使用 在使用explain关键字时,只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…...
【Python】取火柴小游戏(巴什博弈)
火柴游戏:Python编程示例 当我们想要玩一个简单而有趣的游戏,同时又想锻炼自己的编程技能时,一个经典的选择就是火柴游戏。这个游戏的规则很简单:有一堆火柴,每次可以拿走1到6根,两名玩家轮流取火柴&#…...
030-第三代软件开发-密码输入框
第三代软件开发-密码输入框 文章目录 第三代软件开发-密码输入框项目介绍密码输入框总结一下 关键字: Qt、 Qml、 echoMode、 TextInput、 Image 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language…...
mysql读取文件
环境地址:phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY 参考文章: mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客 从一道ctf题学习mysql任意文件读取漏洞 - 安全客,安全资讯平台 MYSQL 任意文件读取 小组CTF出题感想 - …...
CentOS(5)——rpm包和源码包区别
目录 一、简介 二、区别 ①包名称 ②概念 ③优缺点 ④安装位置的区别 ⑤安装位置不同带来的影响 ⑥卸载方式的不同 一、简介 最近在公司内网离线升级Git时,遇见两个概念,分别是使用rpm包安装git,另一个这是编译源码包安装git&#x…...
如何高效提取Android OTA包:payload-dumper-go完整使用指南
如何高效提取Android OTA包:payload-dumper-go完整使用指南 【免费下载链接】payload-dumper-go an android OTA payload dumper written in Go 项目地址: https://gitcode.com/gh_mirrors/pa/payload-dumper-go 在Android系统开发和维护过程中,处…...
OpenClaw小团队协作:Kimi-VL-A3B-Thinking共享模型的经济部署
OpenClaw小团队协作:Kimi-VL-A3B-Thinking共享模型的经济部署 1. 为什么我们需要共享模型部署? 去年夏天,我们团队在开发一个多模态内容分析工具时,遇到了一个典型的技术困境:每个成员都需要频繁调用Kimi-VL-A3B-Thi…...
COMSOL仿真石墨烯吸收器,带视频演示,一步一步教学,原文章来自于一篇二区文章。 图片展示为...
COMSOL仿真石墨烯吸收器,带视频演示,一步一步教学,原文章来自于一篇二区文章。 图片展示为原文献结果,均可复现,视频里面包括设计步骤,可以用来学习操作仿真操作最近在研究石墨烯吸收器的仿真,发…...
A53安全启动基石——TrustZone在A53中的硬件实现
该文章同步至公众号OneChan 开篇:回答上篇进阶思考 在上一篇探讨复位启动的种种陷阱后,我们留下的五个进阶思考问题,现在结合安全启动和TrustZone的特性进行分析: 1. 量子不确定性对复位电路的影响 量子隧穿效应:在…...
001、开篇:为什么是LangChain?大模型应用开发范式变革
001、开篇:为什么是LangChain?大模型应用开发范式变革 昨天深夜调试一个对话场景,被大模型的输出格式折腾得够呛。需求很简单:从用户消息里提取时间、地点、事件三个字段,返回结构化的JSON。我对着API文档写了二十多行…...
Agent 的流程可以随时修改调整吗?深度解析 2026 年智能体动态编排与业务闭环
站在 2026 年的技术节点回望,AI Agent(智能体)早已脱离了最初“对话机器人”的稚嫩标签,演变为企业数字化转型的核心基础设施。针对“Agent 的流程可以随时修改调整吗?”这一核心疑问,答案不仅是肯定的&…...
GPT-SoVITS:革新性少样本语音合成技术深度剖析
GPT-SoVITS:革新性少样本语音合成技术深度剖析 【免费下载链接】GPT-SoVITS 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS 引言:语音合…...
4步打造专属《无人深空》体验:NomNom存档编辑器全功能指南
4步打造专属《无人深空》体验:NomNom存档编辑器全功能指南 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item …...
WPF MES 产线执行系统:AGV与立库协同控制的核心实现
ERP MES 两套系统源代码 WPF AGV C# WPF开发。 A,WPF MES 上位机产线执行系统。 1, 完整纯源代码; 2, AGV自动调度; 3, SQLSERVER数据库。 带附加文件。 4, WPF各种技术应用。 5, 数…...
基于MATLAB+CPLEX gurobi平台的电力系统机组组合研究:考虑安全约束与直流潮流优...
MATLAB代码:考虑安全约束及热备用的电力系统机组组合研究 关键词:机组组合 直流潮流 优化调度 参考文档:自编文档,模型数据清晰明了 仿真平台:MATLABCPLEX/gurobi平台 优势:代码具有一定的深度和创新性&a…...
