JAVAWeb05-xml、DOM4J

news2025/6/20 17:55:05

1. xml概述

1.1 官方文档

地址: https://www.w3school.com.cn/xml/index.asp

1.2 为什么需要 XML

  1. 需求 1 : 两个程序间进行数据通信?
  2. 需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码
  3. spring 中的 ico 配置文件,beans.xml mybatis XXXMapper.xml tomcat server.xml web.xml maven pom.xml
  4. 能存储复杂的数据关系
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<贾府>
	<贾演>
		<贾代化>
		<贾敬></贾敬>
		</贾代化>
	</贾演>
	<贾源>
		<贾代善>
		<贾政></贾政>
		</贾代善>
	</贾源>
</贾府>

1.3 XML 技术用于解决什么问题

● 解决程序间数据传输的问题:=> json
比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
● xml 可以做配置文件
xml 文件做配置文件可以说非常的普遍,比如我们的 tomcat 服务器的 server.xml ,web.xml
● xml 可以充当小型的数据库 => 程序自己的数据格式存放
xml 文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用 xm 来做小型数据库 ,而且直接读取文件显然要比读取数据库快

2. XML 快速入门

2.1 需求分析/图解

需求: 使用 idea 创建 students.xml 存储多个学生信息
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    解读
    1 xml :表示该文件的类型 xml
    2 version="1.0"版本
    3 encoding="UTF-8" 文件编码
    4. students: root元素/根元素, 程序员自己来定
    5. <student></student> 表示students一个子元素, 可以有多个
    6. id就是属性 name, age, gender 是student元素的子元素
    7. 一个xml文件只能有有一个根节点
-->
<students>
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender></gender>
    </student>
    <student id="200">
        <name>mary</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>

3. XML 语法

3.1 一个 XML 文件分为如下几部分内容

1、文档声明
2、元素
3、属性
4、注释
5、CDATA 区 、特殊字符, 后面会说

3.2 文档声明

<?xml version="1.0" encoding="utf-8"?>
1、XML 声明放在 XML 文档的第一行
2、XML 声明由以下几个部分组成:

  • version - -文档符合 XML1.0 规范,我们学习 1.0
  • encoding - -文档字符编码,比如"utf-8"

3.3 元素

  1. 元素语法要求
  • 每个XML文档必须有且只有一个根元素。
  • 根元素是一个完全包括文档中其他所有元素的元素。
  • 根元素的起始标记要放在所有其他元素的起始标记之前。
  • 根元素的结束标记要放在所有其他元素的结束标记之后。
  1. XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
  • 包含标签体:<a>www.sohu.cn</a>
  • 不含标签体的:<a></a>, 简写为:<a/>
  • 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:<a>welcome to <b>www.sohu.org</a></b>
  1. 提示:在很多时候,说 标签、元素、节点是相同的意思

应用实例:
创建 students02.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!--
    解读
    1.每个XML文档必须有且只有一个根元素。
    2.根元素是一个完全包括文档中其他所有元素的元素。
    3.根元素的起始标记要放在所有其他元素的起始标记之前。
    4.根元素的结束标记要放在所有其他元素的结束标记之后
    5.XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式
    包含标签体:<a>www.sohu.cn</a>
    不含标签体的:<a></a>, 简写为:<a/>
    6.一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套
    7. 叫法student 元素,节点,标签
-->
<students>
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender></gender>
    </student>
    <student id="200">
        <name>mary</name>
        <age>18</age>
        <gender></gender>
    </student>
    <school>清华大学</school>
    <city/>
</students>
  1. XML 元素命名规则
  • 区分大小写,例如,<P>和<p>是两个不同的标记。
  • 不能以数字开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)。
  • 如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>

创建 语法/students03.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--
    解读
    1.区分大小写,例如,<P>和<p>是两个不同的标记。
    2.不能以数字开头。
    3.不能包含空格。
    4.名称中间不能包含冒号(:)。
    5.如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>
-->
<students>
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender></gender>
        <email>jack@sohu.com</email>
        <Email>jack2@sohu.com</Email>
        <job>java工程师</job>
        <book_name>三国</book_name>
    </student>
    <student id="200">
        <name>mary</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>

3.4 属性

  1. 属性介绍
<Student ID="100">
	<Name>TOM</Name>
</Student>
  1. 属性值用双引号(“)或单引号(‘)分隔(如果属性值中有’,用"分隔;有”,用’分隔)
  2. 一个元素可以有多个属性,它的基本格式为:<元素名 属性名=“属性值”>
  3. 特定的属性名称在同一个元素标记中只能出现一次
  4. 属性值不能包括& 字符

属性应用实例
students04.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--
    解读
    1.属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)
    2.一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">
    3.特定的属性名称在同一个元素标记中只能出现一次
    4.属性值不能包括& 字符
-->
<students>
    <!--
        举例:
        id='01' 也是正确写法
        如果属性值有" 则使用' 包括属性 比如 id="xxx'yyy"
        如果属性值有' 则使用" 包括属性 比如 id='xxx"yyy'
        属性名在同一个元素标记只能出现一次 <stduent id="01" id="03"> 错误的
        属性值不能包括& 字符 比如: <stduent id="0&1"> 是错误的
    -->
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender></gender>
    </student>
    <student id="200">
        <name>mary</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>

3.5 注释

  1. <!--这是一个注释- ->
  2. 注释内容中不要出现- -;
  3. 不要把注释放在标记中间;错误写法 <Name <!--the name-->>TOM</Name>
  4. 注释不能嵌套;
  5. 可以在除标记以外的任何地方放注释

3.6 CDATA 节!

说明: 有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记。

  1. 语法:
    <![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>
  2. 可以输入任意字符(除]]>外)
  3. 不能嵌套

应用实例
cdata_student.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
    解读
    1.CDATA是大写的
    <![CDATA[
  这里可以把你输入的字符原样显示,不会解析 xml
    ]]>
-->
<students>
    <stduent id="01">
        <name>tom</name>
        <gender></gender>
        <age>18</age>
        <!--
            举例说明:
            下面是一段js的代码片段. 直接放在<code></code>标签间,语法错误
            使用CDATA节来处理即可.
             <script data-compress=strip>
                function h(obj){
                obj.style.behavior='url(#default#homepage)';
                var a = obj.setHomePage('//www.baidu.com/');
                }
            </script>
        -->
    </stduent>
    <stduent id="02">
        <name>scott</name>
        <gender></gender>
        <age>17</age>
        <code>
            <!--如果希望把某些字符串,当做普通文本,使用CDATA包括 -->
            <![CDATA[
                <script data-compress=strip>
                function h(obj){
                obj.style.behavior='url(#default#homepage)';
                var a = obj.setHomePage('//www.baidu.com/');
                }
            </script>
            ]]>

        </code>
    </stduent>
</students>

4. 转义字符

  1. 对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
    在这里插入图片描述
    应用实例:
    创建 xml_char.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--
    解读
    对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
    比如 > < & ' ""
-->
<students>
    <stduent id="01">
        <name>tom</name>
        <gender></gender>
        <age>28</age>
        <!--
            使用转义字符表示一些特殊字符
            <resume>年龄<100 &版权</resume>
        -->
        <resume>年龄&lt;10 &gt; &amp;</resume>
    </stduent>
    <stduent id="02">
        <name>scott</name>
        <gender></gender>
        <age>17</age>
    </stduent>
</students>

5. 格式正规的 XML 文档-小结

遵循如下规则的 XML 文档称为格式正规的 XML 文档:
1、XML 声明语句 <?xml version="1.0" encoding="utf-8"?>
2、必须有且仅有一个根元素
3、标记大小,区分大小写的. 4、属性值用引号
5、标记成对
6、空标记关闭
7、元素正确嵌套
在这里插入图片描述

6. DOM4j

6.1 文档

文档: https://dom4j.github.io/javadoc/1.6.1/

6.2 XML 解析技术原理

  1. 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的dom 技术来解析
  2. document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)
    在这里插入图片描述

6.3 XML 解析技术介绍

● 早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介

  1. dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析也做了实现
  2. sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML ) SAX解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。 是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在性能上优于 Dom 解析
  3. 这两种技术已经过时,知道有这两种技术即可

● 第三方的 XML 解析技术

  1. jdom 在 dom 基础上进行了封装
  2. dom4j 又对 jdom 进行了封装。
  3. pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件

6.4 DOM4J 介绍

  1. Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。
  2. 与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性。
  3. Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。
    现在很多软件采用的 Dom4j。
  4. 使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件

6.5 解压给的 zip 文档, 参考 DOM4J 文档

● 说明:dom4j 的文档在解压后 docs\index.html

在这里插入图片描述

6.6 DOM4j 中,获得 Document 对象的方式有三种

● 开发 dom4j 要导入 dom4j 的包
1、读取 XML 文件,获得 document 对象

SAXReader reader = new SAXReader(); //创建一个解析器
Document document = reader.read(new File("src/input.xml"));//XML Document

2、解析 XML 形式的文本,得到 document 对象.

String text = "<members></members>";
Document document = DocumentHelper.parseText(text);

3、主动创建 document 对象.

Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");

6.7 DOM4j 应用实例

  1. 使用 DOM4J 对 students.xml 文件进行增删改查
  • 重点讲解查询(遍历和指定查询)
  • xml增删改使用少,作为扩展,给出案例
  1. 引入 dom4j 的依赖的 jar 包
    在这里插入图片描述
  2. 创建 students.xml
<?xml version="1.0" encoding="utf-8"?>

<students> 
  <student id="01"> 
    <name>小龙女</name>  
    <gender></gender>  
    <age>19</age>  
    <resume>古墓派掌门人</resume> 
  </student>  
  <student id="02"> 
    <name>欧阳锋</name>  
    <gender></gender>  
    <age>21</age>  
    <resume>白驼山,蛤蟆神功</resume> 
  </student> 
</students>

  1. 创建 Dom4j_.java

document源码分析图
在这里插入图片描述
演示 Dom4j 对 xml 文件的增删改查/遍历

/**
* 演示如何加载xml文件
*/
@Test
public void loadXML() throws DocumentException {
    //得到一个解析器
    SAXReader reader = new SAXReader();
    //老师的代码技巧->debug 看看document对象的属性
    //分析了document对象的底层结构 如上图
    Document document = reader.read(new File("src/students.xml"));
    System.out.println(document);

}

/**
 * 遍历所有的student信息
 */
@Test
public void listStus() throws DocumentException {
    //得到一个解析器
    SAXReader reader = new SAXReader();
    //老师的代码技巧->debug 看看document对象的属性
    //分析了document对象的底层结构
    Document document = reader.read(new File("src/students.xml"));

    //1. 得到rootElement, 你是OOP
    Element rootElement = document.getRootElement();
    //2. 得到rootElement的student Elements
    List<Element> students = rootElement.elements("student");
    //System.out.println(student.size());//2
    for (Element student : students) {//element就是Student元素/节点
        //获取Student元素 的name Element
        Element name = student.element("name");
        Element age = student.element("age");
        Element resume = student.element("resume");
        Element gender = student.element("gender");

        System.out.println("学生信息= " + name.getText() + " " + age.getText() +
                " " + resume.getText() + " " + gender.getText());
    }

}

/**
 * 指定读取第一个学生的信息 就是 dom4j+xpath
 */
@Test
public void readOne() throws DocumentException {

    //得到一个解析器
    SAXReader reader = new SAXReader();
    //老师的代码技巧->debug 看看document对象的属性
    //分析了document对象的底层结构
    Document document = reader.read(new File("src/students.xml"));

    //1. 得到rootElement, 你是OOP
    Element rootElement = document.getRootElement();

    //2. 获取第一个学生
    Element student = (Element) rootElement.elements("student").get(1);
    //3. 输出该信息
    System.out.println("该学生的信息= " + student.element("name").getText() + " " +
            student.element("age").getText() + " " + student.element("resume").getText() +
            student.element("gender").getText());

    //4. 获取student元素的属性
    System.out.println("id= " + student.attributeValue("id"));
}

/**
 * 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
 * @throws Exception
 */
@Test
public void add() throws Exception {

    //1.得到解析器
    SAXReader saxReader = new SAXReader();
    //2.指定解析哪个xml文件
    Document document = saxReader.read(new File("src/students.xml"));


    //首先我们来创建一个学生节点对象
    Element newStu = DocumentHelper.createElement("student");
    Element newStu_name = DocumentHelper.createElement("name");
    //如何给元素添加属性
    newStu.addAttribute("id", "04");
    newStu_name.setText("宋江");
    //创建age元素
    Element newStu_age = DocumentHelper.createElement("age");
    newStu_age.setText("23");
    //创建resume元素
    Element newStu_intro = DocumentHelper.createElement("resume");
    newStu_intro.setText("梁山老大");

    //把三个子元素(节点)加到 newStu下
    newStu.add(newStu_name);
    newStu.add(newStu_age);
    newStu.add(newStu_intro);
    //再把newStu节点加到根元素
    document.getRootElement().add(newStu);
    //直接输出会出现中文乱码:
    OutputFormat output = OutputFormat.createPrettyPrint();
    output.setEncoding("utf-8");//输出的编码utf-8

    //把我们的xml文件更新
    // lets write to a file
    //new FileOutputStream(new File("src/myClass.xml"))
    //使用到io编程 FileOutputStream 就是文件字节输出流
    XMLWriter writer = new XMLWriter(
            new FileOutputStream(new File("src/students.xml")), output);
    writer.write(document);
    writer.close();

}

/**
 * //删除元素(要求:删除第一个学生) 使用少,了解
 * @throws Exception
 */
@Test
public void del() throws Exception {
    //1.得到解析器
    SAXReader saxReader = new SAXReader();
    //2.指定解析哪个xml文件
    Document document = saxReader.read(new File("src/students.xml"));
    //找到该元素第一个学生
    Element stu = (Element) document.getRootElement().elements("student").get(2);
    //删除元素
    stu.getParent().remove(stu);
//        //删除元素的某个属性
//        stu.remove(stu.attribute("id"));
    //更新xml
    //直接输出会出现中文乱码:
    OutputFormat output = OutputFormat.createPrettyPrint();
    output.setEncoding("utf-8");//输出的编码utf-8
    //把我们的xml文件更新
    XMLWriter writer = new XMLWriter(
            new FileOutputStream(new File("src/students.xml")), output);
    writer.write(document);
    writer.close();
    System.out.println("删除成功~");
}


/**
 * //更新元素(要求把所有学生的年龄+3) 使用少,了解
 * @throws Exception
 */
@Test
public void update() throws Exception {

    //1.得到解析器
    SAXReader saxReader = new SAXReader();
    //2.指定解析哪个xml文件
    Document document = saxReader.read(new File("src/students.xml"));
    //得到所有学生的年龄
    List<Element> students = document.getRootElement().elements("student");
    //遍历, 所有的学生元素的age+3
    for (Element student : students) {
        //取出年龄
        Element age = student.element("age");
        age.setText((Integer.parseInt(age.getText()) + 3) + "");
    }

    //更新
    //直接输出会出现中文乱码:
    OutputFormat output = OutputFormat.createPrettyPrint();
    output.setEncoding("utf-8");//输出的编码utf-8

    //把我们的xml文件更新
    XMLWriter writer = new XMLWriter(
            new FileOutputStream(new File("src/students.xml")), output);
    writer.write(document);
    writer.close();
    System.out.println("更新成功~");
}

6.8 课后作业

在这里插入图片描述

books.xml

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book id="100">
        <name>西游记</name>
        <author>吴承恩</author>
        <price>80</price>
    </book>
    <book id="200">
        <name>三国</name>
        <author>罗贯中</author>
        <price>100</price>
    </book>
</books>

Book.java

public class Book {
    private Integer id;
    private String name;
    private String author;
    private Double price;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

Homework.java

public static void main(String[] args) throws DocumentException {

    //1.得到解析器
    SAXReader saxReader = new SAXReader();
    //2.指定解析哪个xml文件
    Document document = saxReader.read(new File("src/books.xml"));

    //3.遍历所有的book元素
    List<Element> books = document.getRootElement().elements("book");
    for (Element book : books) {
        //取出book元素的所有信息
        Element name = book.element("name");
        Element author = book.element("author");
        Element price = book.element("price");
        String id = book.attributeValue("id");
        //创建成Book对象
        Book book1 = new Book();
        book1.setId(Integer.parseInt(id));
        book1.setName(name.getText());
        book1.setPrice(Double.parseDouble(price.getText()));
        book1.setAuthor(author.getText());
        System.out.println("book1对象信息= " + book1);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数字人】使用Metahuman创建数字人模型(上)

这两年数字人类的概念可谓是风头正盛&#xff0c;市面上也流行起各式各样的数字人技术&#xff0c;效果能力及实现成本各不相同。本系列介绍基于Unreal Engine的Metahuman工具低成本构建一个拥有完整的控制权、免费、可商用、高仿真的数字人。本篇为构建基础人物模型 MetaHuma…

PHP快速入门14-Composer包管理安装与使用,附常见的20个使用例子

文章目录 前言一、关于Composer二、如何安装Composer2.1 Windows安装Composer2.2 Linux安装Composer 三、Composer常见的20个使用例子3.1 查找并安装依赖包3.2 更新依赖包3.3 安装指定版本的依赖包3.4 卸载依赖包3.5 查看当前项目依赖包列表3.6 初始化composer.json文件3.7 安装…

FAT32文件系统学习

FAT32文件系统组成及介绍 FAT32文件系统结构图&#xff1a; 下图演示了FAT32文件系统的DBR&#xff1a; 1.DBR及其保留扇区&#xff1a;含义是DOS引导记录&#xff0c;也称为操作系统引导记录&#xff0c;在DBR之后往往有一些保留扇区 跳转指令&#xff1a;跳转指令本身占用2字…

python程序打包成可执行文件【进阶篇】

python程序打包成可执行文件【进阶篇】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 python程序打包成可执行文件【进阶篇】[TOC](文章目录) 前言安装PyInstaller包打包深度学习模型生成spec文件修改spec文件运行spec文件进行打包执行exe可执…

为什么倒谱可以分析回声

一个有趣的现象&#xff1a;倒谱上的第一个峰&#xff0c;恰好对应回声相比原声的延时。回声 y y y 是原始声音 x x x 延迟 t 0 t_0 t0​ 秒后的、带有衰减 α α α 的副本 y α x ( t − t 0 ) y αx (t - t_0) yαx(t−t0​) 方便起见&#xff0c;这里取 α 1 α …

抖音强势入局服装生意,出手就是1个亿,服装实体店出路在哪?

最近&#xff0c;抖音盯上了服装生意。 据悉&#xff0c;抖音近期组建了一个自营服装团队&#xff0c;在APP推出了一家“飞云织上”的店铺&#xff0c;店铺主体公司是“上海歆湃信息科技有限公司”。 根据爱企查显示&#xff0c;这家公司由抖音集团&#xff08;香港&#xff09…

RabbitMQ-消息模型

什么是MQ MQ全称是Message Queue,即消息对列&#xff01;消息队列是典型的&#xff1a;生产者、消费者模型。生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c;没…

IPV4与IPV6是什么?有什么区别?

目录 一. IPV4是什么&#xff1f; 二. IPV6是什么 三. IPv4和IPv6有什么区别&#xff1f; 1.地址类型 2.数据包大小 3.header区域字段数 4.可选字段 5.配置 6.安全性 7.与移动设备的兼容性 8.主要功能 IP协议&#xff08;互联网协议&#xff09;是互联网协议群&#…

USB TO SPI / USB TO I2C 软件概要 6--- 专业版调试器

所需设备&#xff1a; 1、USB转SPI_I2C适配器(专业版); 软件概述&#xff1a; SPI类: USB TO SPI 1.0-Slave SPI从机软件&#xff0c;适合单步调试&#xff0c;支持SPI工作模式0、1、2、3&#xff0c;自动跟随主机通讯速率&#xff0c;自动接收数据&#xff1b; USB TO S…

大城市的IT岗位,饱和了么?

现在学或即将更要学习IT专业的同学&#xff0c;经常会考虑这样一个问题&#xff1a;现在的计算机专业到处都有&#xff0c;大学里有、职业学校有&#xff0c;就连社会上的培训机构也有&#xff0c;而且专业分类更细化&#xff0c;有这么多的地方都在培训计算机相关专业&#xf…

二本4年测龄年仅25岁,五面阿里(定薪25K).....

体验了一下阿里的面试&#xff0c;不愧是大厂&#xff0c;考察范围既有深度也有宽度。努力回想了下面试的内容和自己当时的回答&#xff0c;这里给大家分享下自己的经验&#xff0c;也给自己做个归档&#xff0c;希望能给正在准备跳槽&#xff0c;找工作的朋友一点帮助&#xf…

每一个软件测试工程师都有要牢记的误区

最近跟一些刚刚进入软件测试行业的朋友去交流&#xff0c;发现了一个有趣的现象&#xff0c;就是对于这个行业的很多问题的认识都是一致的片面&#xff0c;当然也可以理解为误区。自己利用一点时间&#xff0c;把他们对于这个行业的认识误区都罗列出来&#xff0c;然后结合自己…

【Python从入门到进阶】16、文件的打开和关闭

接上篇《15、函数的定义和使用》 上一篇我们学习了Python中函数的定义和使用&#xff0c;包括函数的参数、返回值、局部变量和全景变量等操作。从本篇开始我们来开始学习Python对文件的一些操作&#xff0c;本篇我们主要讲解如何使用Python打开和关闭文件。 一、打开/创建文件…

全国青少年编程等级考试scratch四级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.编写一段程序&#xff0c;从26个英文字母中&#xff0c;随机选出10个加入列表a。空白…

【id:45】【20分】A. Equation(类与对象+构造)

题目描述 建立一个类Equation&#xff0c;表达方程ax2bxc0。类中至少包含以下方法&#xff1a; 1、无参构造&#xff08;abc默认值为1.0、1.0、0&#xff09;与有参构造函数&#xff0c;用于初始化a、b、c的值&#xff1b; 2、set方法&#xff0c;用于修改a、b、c的值 3、ge…

JSP原理

1.什么是JSP Java Server Page:Java服务器端页面&#xff0c;也和Servlet一样&#xff0c;用于动态Web技术 最大的特点&#xff1a;写JSP就像再写HTML 页面生成了java JSP本质上就是servlet 3.输出页面前增加的代码 1.response.setContentType("text/html"); //设…

C++ ubuntu环境下安装编译部署环境,用onnxruntime部署ppyoloe_r模型

在新安装的ubuntu环境下修改源、安装gcc和cmake&#xff0c;编译安装opencv&#xff0c;安装onnxruntime环境。并编写cmakelist文件&#xff0c;编译与运行ppyoloe_r模型。 windows环境下onnx部署ppyoloe_r模型的代码可以参考 https://blog.csdn.net/a486259/article/details/1…

Python-入门基础小练习

通过前面的两个篇章Python-入门基础篇和Python-入门基础语句篇大家应该已经认识了python基础的语句和函数了&#xff0c;并且可以使用pycharm编译器创建.py文件进行运行了&#xff0c;今天适当的来一些小练习&#xff0c;给枯燥的学习增添一些趣味性。 判断一个数是否为偶数 …

Node 模块

文章目录 Node 模块概述使用方式一&#xff1a;module.exports方式二&#xff1a;exports 目录模块package.json配置 引入模块的基本流程 Node 模块 概述 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为模块化。 其中拆分出的 每…

Identity标识框架配上JWT的使用

在Identity标识框架的代码上继续编写 .Net中的标识框架Identity_风的艺术的博客-CSDN博客 添加NuGet包 Nuget&#xff1a;Microsoft.AspNetCore.Authentication.JwtBearer 创建存储JWT数据类 public class JWTOptions { public string SigningKey { get; set; } pub…