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

【JavaWeb】JavaWeb入门之XML详解

目录

1.XML介绍

1.1.XML概述

1.1.1.什么是XML

1.1.2.XML的作用

1.1.3.XML与HTML的比较

1.1.4.XML和properties(属性文件)比较

1.1.5.W3C组织

1.2.XML语法概述

1.2.1.XML文档展示

1.2.2.XML文档的组成部分

1.3.XML文档声明

1.3.1.什么是XML文档声明

1.3.2.XML文档声明结构

1.4.XML元素

1.4.1.XML元素的格式

1.4.2.XML文档的根元素

1.4.3.元素中的空白

1.4.4.元素命名规范

1.4.5.元素属性

1.4.6.注释

1.4.7.转义字符

1.4.8.CDATA段

2.XML解析

2.1.操作XML文档概述

2.1.1.如何操作XML文档

2.1.2.XML解析技术

2.2.DOM4J

2.2.1.DOM4J概述

2.2.1.1.DOM4J是什么

2.2.1.2.DOM4J中的类结构

2.2.1.3.DOM4J获取Document对象

2.2.1.4.DOM4J保存Document对象

2.2.1.5.DOM4J创建Document对象

2.2.2.Document操作

2.2.2.1.遍历students.xml

2.2.3.XPath

2.2.3.1.什么是XPath

2.2.3.2.DOM4J对XPath的支持


1.XML介绍

1.1.XML概述

1.1.1.什么是XML

XML全称Extensible Markup Language,意思是可扩展的标记语言,它是 SGML(标准通用标记语言)的一个子集

1.1.2.XML的作用

  • XML是程序的配置文件

  • 可以在不同语言之间交换数据

  • 作为小型数据库存储数据

1.1.3.XML与HTML的比较

  • HTML的元素是固定的,而XML可以自定义元素

  • HTML用浏览器来解析执行,XML的解析器通常需要自己来写(因为元素是自定义的)

  • HTML只能用来表示网页,而XML的使用场景更多

1.1.4.XML和properties(属性文件)比较

  • properties只能存储平面信息,而XML可以存储结构化信息

  • 解析properties只需要使用Properties类就可以了,而解析XML文件是很复杂的

1.1.5.W3C组织

W3C是万维网联盟(World Wide Web Consortium)英文的缩写,它成立于1994年10月,以开放论坛的方式来促进开发互通技术(包括规格、指南、软件和工具),开发网络的全部潜能。万维网联盟(W3C)从1994年成立以来,已发布了90多份Web技术规范,领导着Web技术向前发展

W3C认为自身不是官方组织,因此将它正式发布的规范称为推荐(建议)标准,意思是进一步标准化的建议,但是由于组织自身的权威性往往成为事实上的标准

1.2.XML语法概述

1.2.1.XML文档展示

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students><student number="1001"><name>zhangSan</name><age>23</age>    <sex>male</sex></student><student number="1002"><name>liSi</name><age>32</age><sex>female</sex></student><student number="1003"><name>wangWu</name><age>55</age><sex>male</sex></student>
</students>

1.2.2.XML文档的组成部分

  • XML文档声明

  • XML处理指令

  • XML元素

  • XML特殊字符和CDATA区 [![CADATA <<<<>>>>>> ]]

  • XML注释 <!--- -->

1.3.XML文档声明

1.3.1.什么是XML文档声明

可以看作是XML文档的说明

最简单的xml文档声明:<?xml version="1.0"?>

1.3.2.XML文档声明结构

  • version属性:用于说明当前xml文档的版本,因为都是在用1.0,所以这个属性值大家都写1.0,version属性是必须的

  • encoding属性:用于说明当前xml文档使用的字符编码集,xml解析器会使用这个编码来解析xml文档。encoding属性是可选的,默认为UTF-8。注意,如果当前xml文档使用的字符编码集是gb2312,而encoding属性的值为UTF-8,那么一定会出错的

  • standalone属性:用于说明当前xml文档是否为独立文档,如果该属性值为yes,表示当前xml文档是独立的,如果为no表示当前xml文档不是独立的,即依赖外部的约束文件,默认是yes

  • 没有xml文档声明的xml文档,不是格式良好的xml文档

  • xml文档声明必须从xml文档的1行1列开始

1.4.XML元素

1.4.1.XML元素的格式

XML元素包含开始标签、元素体(内容)、结束标签。例如:<hello>大家好</hello>

空元素只有开始标签,没有元素体和结束标签,但空元素一定要闭合。例如:<hello/>

XML元素可以包含子元素或文本数据。例如:hello,a元素的元素体内容是b元素,而b元素的元素体内容是文本数据hello

XML元素可以嵌套,但必须是合法嵌套。<b>hello</b>就是错误的嵌套

1.4.2.XML文档的根元素

格式良好的XML文档必须有且仅有一个根元素

student1.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<students><student number="1001"><name>zhangSan</name><age>23</age><sex>male</sex></student><student number="1002"><name>liSi</name><age>32</age><sex>female</sex></student>
</students>

student2.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<student number="1001"><name>zhangSan</name><age>23</age><sex>male</sex>
</student>
<student number="1002"><name>liSi</name><age>32</age><sex>female</sex>
</student>

student1.xml是格式良好的xml文档,只有一个根元素,即students元素

student2.xml不是格式良好的xml文档,有两个根元素,即两个student根元素

1.4.3.元素中的空白

XML元素的元素体可以包含文本数据和子元素

a.xml

<a><b>hello</b></a>

b.xml

<a><b>hello</b>
</a>

a.xml中,<a>元素只有一个子元素,即<b>元素。<b>元素只有一个文本数据,即hello

b.xml中,<a>元素中第一部分为换行缩进,第二部分为<b>元素,第三部分为换行。b元素的文本数据为换行、缩进、hello、换行、缩进

其中换行和缩进都是空白,这些空白是为了增强xml文档的可读性。但xml解析器可能会因为空白出现错误的解读,这说明在将来编写解析xml程序时,一定要小心空白!!!

1.4.4.元素命名规范

XML元素名可以包含字母、数字以及一些其他可见字符,但必须遵循下面的一些规范:

  • 区分大小写:<a>和<A>是两个元素

  • 不能以数字开头:<1a>是错误的命名

  • 最好不要以xml开头:<xml>、<Xml>、<XML>

  • 不能包含空格

1.4.5.元素属性

  • 属性由属性名与属性值构成,中间用等号连接

  • 属性值必须使用引号括起来,单引号或双引号都可以

  • 定义属性必须遵循与标签名相同的命名规范

  • 属性必须定义在元素的开始标签中

  • 一个元素中不能包含相同的属性名

1.4.6.注释

  • 注释以<!--开头,以-->结束

  • 注释中不能包含--

1.4.7.转义字符

因为在xml文档中有些字符是特殊的,不能使用它们作为文本数据。例如:不能使用“<”或“>”等字符作为文本数据,所以需要使用转义字符来表示

例如<a><a></a>,你可能会说,其中第二个<a>是a元素的文本内容,而不是一个元素的开始标签,但xml解析器是不会明白你的意思的。把<a><a></a>修饰为<a><a></a>,这就OK了

转义字符都是以“&”开头,以“;”结束。这与后面我们学习的实体是相同的

1.4.8.CDATA段

当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些

在CDATA段出现的“<”、“>”、“””、“’”、“&”,都无需使用转义字符。这可以提高xml文档的可读性

<a><![CDATA[<a>]]></a>

在CDATA段中不能包含“]]>”,即CDATA段的结束定界符

2.XML解析

2.1.操作XML文档概述

2.1.1.如何操作XML文档

XML文档也是数据的一种,对数据的操作也不外乎是“增删改查”。也被大家称之为“CRUD”

2.1.2.XML解析技术

XML解析方式分为两种:DOM(Document Object Model)和SAX(Simple API for XML)。这两种方式不是针对Java语言来解析XML的技术,而是跨语言的解析方式。例如DOM也在JavaScript中存在

DOM是W3C组织提供的解析XML文档的标准接口,而SAX是社区讨论的产物,是一种事实上的标准

DOM和SAX只是定义了一些接口,以及某些接口的缺省实现,而这个缺省实现只是用空方法来实现接口。一个应用程序如果需要DOM或SAX来访问XML文档,还需要一个实现了DOM或SAX的解析器,也就是说这个解析器需要实现DOM或SAX中定义的接口。提供DOM或SAX中定义的功能

2.2.DOM4J

2.2.1.DOM4J概述

2.2.1.1.DOM4J是什么

DOM4J是针对Java开发人员专门提供的XML文档解析规范,它不同于DOM,但与DOM相似。DOM4J针对Java开发人员而设计,所以对于Java开发人员来说,使用DOM4J要比使用DOM更加方便

DOM4J对DOM和SAX提供了支持,使用DOM4J可以把org.dom4j.document转换成org.w3c.Document,DOM4J也支持基于SAX的事件驱动处理模式

使用者需要注意,DOM4J解析的结果是org.dom4j.Document,而不是org.w3c.Document。DOM4J与DOM一样,只是一组规范(接口与抽象类组成),底层必须要有DOM4J解析器的实现来支持

DOM4J使用JAXP来查找SAX解析器,然后把XML文档解析为org.dom4j.Document对象。它还支持使用org.w3c.Document来转换为org.dom4j.Docment对象

2.2.1.2.DOM4J中的类结构

在DOM4J中,也有Node、Document、Element等接口,结构上与DOM中的接口比较相似。但还是有很多的区别:

在DOM4J中,所有XML组成部分都是一个Node,其中Branch表示可以包含子节点的节点,例如Document和Element都是可以有子节点的,它们都是Branch的子接口

Attribute是属性节点,CharacterData是文本节点,文本节点有三个子接口,分别是CDATA、Text、Comment

2.2.1.3.DOM4J获取Document对象

使用DOM4J来加载XML文档,需要先获取SAXReader对象,然后通过SAXReader对象的read()方法来加载XML文档:

SAXReader reader = new SAXReader();
Document doc = reader.read("src/students.xml");
2.2.1.4.DOM4J保存Document对象

保存Document对象需要使用XMLWriter对象的write()方法来完成,在创建XMLWriter时还可以为其指定XML文档的格式(缩进字符串以及是否换行),这需要使用OutputFormat来指定

doc.addDocType("students", "", "students.dtd");
OutputFormat format = new OutputFormat("\t", true);
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileWriter(xmlName), format);
writer.write(doc);
writer.close();
2.2.1.5.DOM4J创建Document对象

DocumentHelper类有很多的createXXX()方法,用来创建Node对象

Document doc = DocumentHelper.createDocument();

2.2.2.Document操作

2.2.2.1.遍历students.xml

涉及的相关方法:

Element getRootElement():Document的方法,用来获取根元素

List elements():Element的方法,用来获取所有孩子元素

String attributeValue(String name):Element的方法,用来获取指定名字的属性值

Element element(String name):Element的方法,用来获取第一个指定名字的子元素

String elementText(String name):Element的方法,用来获取第一个指定名字的子元素的文本内容

分析步骤:

1.获取Document对象

2.获取root元素

3.获取root所有子元素

4.遍历每个student元素

  • 打印student元素number属性

  • 打印student元素的name子元素内容

  • 打印student元素的age子元素内容

  • 打印student元素的sex子元素内容

2.2.3.XPath

2.2.3.1.什么是XPath

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言

2.2.3.2.DOM4J对XPath的支持

在DOM4J中,Node接口中的三个方法最为常用

  • List selectNodes(String xpathExpression):在当前节点中查找满足XPath表达式的所有子节点;

  • Node selectSingleNode(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点;

  • String valueOf(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点的文本内容;

Document doc = reader.read(new FileInputStream("person.xml"));
​
Element root = doc.getRootElement();
List<Element> eList = root.selectNodes("/persons");
List<Element> eList1 = root.selectNodes("/persons/person/name");
​
List<Element> eList2 = root.selectNodes("//age");
List<Element> eList3 = root.selectNodes("//person/age");
​
List<Element> eList4 = root.selectNodes("/*/*/address");
List<Element> eList5 = root.selectNodes("//*");
​
List<Element> eList6 = root.selectNodes("/persons/person[1]");
List<Element> eList7 = root.selectNodes("/persons/person[last()]");
​
List<Element> eList8 = root.selectNodes("//@id");
List<Element> eList9 = root.selectNodes("//person[@id]");
List<Element> eList10 = root.selectNodes("//person[@*]");
List<Element> eList11 = root.selectNodes("//*[not(@*)]");
​
List<Element> eList12 = root.selectNodes("//person[@id='person1']");

相关文章:

【JavaWeb】JavaWeb入门之XML详解

目录 1.XML介绍 1.1.XML概述 1.1.1.什么是XML 1.1.2.XML的作用 1.1.3.XML与HTML的比较 1.1.4.XML和properties&#xff08;属性文件&#xff09;比较 1.1.5.W3C组织 1.2.XML语法概述 1.2.1.XML文档展示 1.2.2.XML文档的组成部分 1.3.XML文档声明 1.3.1.什么是XML文…...

JS手写-this绑定实现

在 JavaScript 中&#xff0c;bind、call 和 apply 方法都可以用来改变函数的 this 指向。下面我们将分别实现这些方法的简单版本。 1. 实现 bind bind 方法创建一个新的函数&#xff0c;在调用时设置 this 值&#xff0c;并返回这个新的函数。 Function.prototype.myBind …...

【时间之外】IT人求职和创业应知【31】

目录 新闻一&#xff1a;2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 新闻三&#xff1a;“5G工业互联网”融合应用试点城市名单…...

如何使用ffmpeg命令行进行录屏

录屏软件&#xff0c;我们去网上下载&#xff0c;发现有很多软件都是要收费的&#xff01;但是录屏功能很难做吗&#xff1f;为啥都需要收费呢&#xff1f; 于是我整了个小demo&#xff0c;用于实现基础的屏幕录制功能。 思路很简单&#xff0c;考虑到 FFMpeg.exe是一个非常成…...

ODOO学习笔记(8):模块化架构的优势

灵活性与可定制性 业务流程适配&#xff1a;企业的业务流程往往因行业、规模和管理方式等因素而各不相同。Odoo的模块化架构允许企业根据自身的具体业务流程&#xff0c;选择和组合不同的模块。例如&#xff0c;一家制造企业可以启用采购、库存、生产和销售模块&#xff0c;并通…...

数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用

昨天帮助社区IC训练营学员远程协助解决一个Calibre DRC案例。通过这个DRC Violation向大家分享下Innovus和ICC2中如何批量约束cell的spacing rule。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案 下图所示为T12nm A55项目的Ca…...

每日小练:Day2

1.乒乓球筐 题目链接&#xff1a;乒乓球筐__牛客网 题目描述&#xff1a; 这道题主要考察B盒是不是A盒的子集&#xff0c;我们可以通过哈希表来做 单哈希表 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stat…...

ubuntu 安装kafka-eagle

上传压缩包 kafka-eagle-bin-2.0.8.tar.gz 到集群 /root/efak 目录 cd /root/efak tar -zxvf kafka-eagle-bin-2.0.8.tar.gz cd /root/efak/kafka-eagle-bin-2.0.8 mkdir /root/efakmodule tar -zxvf efak-web-2.0.8-bin.tar.gz -C /root/efakmodule/ mv /root/efakmodule/efak…...

深入理解指针

在初步了解了指针的用法之后&#xff0c;我们可以想一想&#xff0c;既然一个变量有地址&#xff0c;而且在上一篇文章中我们知道了一个数组也有地址&#xff0c;那么函数、字符串这些东西有没有地址呢&#xff1f;如果有&#xff0c;那这些地址有什么用&#xff1f;我们又要怎…...

自动驾驶合集(更新中)

文章目录 车辆模型控制路径规划 车辆模型 车辆模型基础合集 控制 控制合集 路径规划 规划合集...

Chapter 14 scoped样式以及data函数

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 1 scoped样式1.1 全局样式1.2 局部样式1.3 工作原理2 data函数 1 scoped样式 1.1 全局样式 全局样式是指作用于整个应用程序的样式&#xff0c;不论在哪个组件中定义&#x…...

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…...

区块链技术在电子政务中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在电子政务中的应用 区块链技术在电子政务中的应用 区块链技术在电子政务中的应用 引言 区块链技术概述 定义与原理 发…...

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题&#xff0c;记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…...

WPF-控件的属性值的类型转化

控件的属性值需要转成int、double进行运算的&#xff0c;可以使用一下方法 页面代码 <StackPanel Margin"4,0,0,0" Style"{StaticResource Form-StackPanel}"> <Label Content"替换后材料增加金额&#xff…...

海思Hi3516DV300上播放G711U音频文件

在海思Hi3516DV300芯片运行Linux系统下&#xff0c;可通过如下函数来实现G711U音频文件的播放&#xff1a; int ADecPlayVoiceFile(const char* filename) {FILE* pfd;AUDIO_STREAM_S stStream;HI_S32 s32Ret,length,decLength,allLength 0,aChn 0;HI_U8 buf[SAMPLE_AUDIO_P…...

Linux源码阅读笔记-V4L2框架基础介绍

V4L2视频设备驱动基础 V4L2 是专门为 Linux 设备设计的整套视频框架&#xff08;其主要核心在 Linux 内核&#xff0c;相当于 Linux 操作系统上层的视频源捕获驱动框架&#xff09;。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2 驱动框架能够支持多种类型设备&…...

列表(list)

一、前言 本次博客主要讲解 list 容器的基本操作、常用接口做一个系统的整理&#xff0c;结合具体案例熟悉自定义内部排序方法的使用。如有任何错误&#xff0c;欢迎在评论区指出&#xff0c;我会积极改正。 二、什么是list list是C的一个序列容器&#xff0c;插入和删除元素…...

使用Python抓取数据的实战指南

引言 在当今信息爆炸的时代&#xff0c;数据已成为一种宝贵的资源。无论是学术研究、市场分析&#xff0c;还是个人兴趣&#xff0c;数据的获取都是至关重要的一步。Python&#xff0c;凭借其强大的库和简洁的语法&#xff0c;成为了数据抓取&#xff08;也称为网络爬虫或网页…...

GIC寄存器介绍

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…...

c++实现B树(下)

书接上回小吉讲的是B树的搭建和新增方法的实现&#xff08;blog传送门&#x1f6aa;&#xff1a;B树实现上&#xff09;&#xff08;如果有小可爱对B树还不是很了解的话&#xff0c;可以先看完上一篇blog&#xff0c;再来看小吉的这篇blog&#xff09;。那这一篇主要讲的是B树中…...

外星人入侵

学习于Python编程从入门到实践&#xff08;Eric Matthes 著&#xff09; 整体目录&#xff1a;外星人入侵文件夹是打包后的不必在意 图片和音效都是网上下载的 音效下载网站&#xff1a;Free 游戏爆击中 Sound Effects Download - Pixabay 运行效果&#xff1a;可以上下左右移…...

【数据仓库】hbase的安装与简单操作

HBase 是一个分布式的、面向列的开源数据库&#xff0c;它支持大规模数据存储&#xff0c;并且是 Hadoop 生态系统的一部分。HBase 能够在廉价的硬件上运行&#xff0c;并提供对大量数据的随机、实时读写访问。下面是关于如何在 Linux 系统上安装 HBase 以及进行一些基本操作的…...

为什么RNN(循环神经网络)存在梯度消失和梯度爆炸?

1️⃣ 原理分析 RNN前向传播的公式为&#xff1a; x t x_t xt​是t时刻的输入 s t s_t st​是t时刻的记忆&#xff0c; s t f ( U ⋅ x t W ⋅ s t − 1 ) s_tf(U\cdot x_tW\cdot s_{t-1}) st​f(U⋅xt​W⋅st−1​)&#xff0c;f表示激活函数&#xff0c; s t − 1 s_{t-1} …...

【数据库】数据库迁移的注意事项有哪些?

数据库迁移是一个复杂且关键的过程&#xff0c;需要谨慎处理以确保数据的完整性和应用程序的正常运行。以下是一些数据库迁移时需要注意的事项&#xff1a; 1. 充分的前期准备 1.1 评估迁移需求 明确目标&#xff1a;确定迁移的具体目标&#xff0c;例如添加新字段、修改现…...

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议&#xff0c;和HTTP类似&#xff0c;因为轻量简单&…...

pycharm中from[本地包]import文件/模块出现问题(最最最全方法!)

1.通过PYTHONPATH的方法在此处将路径添加上&#xff0c;能够让IDE访问得到。 2.通过选中目标文件所在的文件的文件夹单击右键&#xff0c;如下图所示可以看到下方的mark directory as选项中存在 存在excluded&#xff0c;选择此项可解决问题&#xff0c;如果仍有问题可以尝试其…...

MongoDB在现代Web开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…...

Python Bokeh 数据可视化教程

Python Bokeh 数据可视化教程 引言 在数据科学和分析的过程中&#xff0c;数据可视化是一个至关重要的环节。它不仅能帮助我们更好地理解数据&#xff0c;还能在报告和展示中提升数据的可读性和吸引力。Python 作为数据科学的主要工具之一&#xff0c;提供了多种数据可视化库…...

(一)<江科大STM32>——软件环境搭建+新建工程步骤

一、软件环境搭建 &#xff08;1&#xff09;安装 Keil5 MDK 文件路径&#xff1a;江科大stm32入门教程资料/Keil5 MDK/MDK524a.EXE&#xff0c;安装即可&#xff0c;路径不能有中文。 &#xff08;2&#xff09;安装器件支持包 文件路径&#xff1a;江科大stm32入门教程资料…...