【Java Web学习笔记】5 - XML

news2024/11/24 6:36:24

项目代码

https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/xml

零、在线文档

XML系列教程

一、XML引出

1.为什么需要XML

1.需求1 :两个程序间进行数据通信?

2.需求2:给一台服务器,做-一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码

3、spring 中的ico配置文件,beans.xml mybatis XXXMapper.xml tomcat server.xml web.xml maven pom.xml

4.能存储复杂的数据关系

2.XML用于解决什么问题

1.解决程序间数据传输的问题:

比如qq之间的数据传送,用xmI格 式来传送数据,具有良好的可读性,可维护性。

2.xmI可以做配置文件(目前主要用法)

xmI文件做配置文件可以说非常的普遍,比如我们的tomcat服务器的server.xml,web.xml

3.xmI可以充当小型的数据库

xml文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用xm来做小型数据库,而且直接读取文件显然要比读取数据库快

 3.案例

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元素的子元素
-->
<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>

二、XML基本语法

1.基本语法

1、文档声明
2、元素
3、属性
4、注释
5、CDATIA区、特殊字符
 

2.XML语法 - 文档说明

<?xmI version="1.0" encoding="utf-8"?>

1、XML声明放在XML文档的第一行

2、XML声明由以下几个部分组成:

3、version -- 文档符合XML1.0规范,我们学习1.0

4、encoding -- 文档字符编码,比如"utf-8"

3.XML语法 - 元素

1.元素语法要求

        每个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>

2. XML元素指XML文件中出现的标签,- 一个标签分为开始标签和结束标签,- 一个标签有如下几种书写形式,例如:

        包含标签体: <a>www.sohu.cn</a> >

        不含标签体的: . <a>< :/a>,简写为: <a/>

        一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套,例如: <a>welcome to<b>www.sohu.org</a></b>

3.在很多时候,说标签、元素、节点是相同的意思

4. XML元素命名规则

        区分大小写,例如,<P>和<p>是两个不同的标记。

        不能以数字开头。

        不能包含空格。

        名称中间不能包含冒号(:)。

        如果标签单词需要间隔,建议使用下划线比如<book_title>hello< /book_ title>

4.XML语法 - 属性

1.属性介绍

        <Student ID="100" >

        < Name>TOM< / Name>

        </Student>

2.属性值用双引号(") 或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)

3.一个元素可以有多个属性,它的基本格式为: <元素名属性名="属性值">

4.特定的属性名称在同-一个元素标记中只能出现--次

5.属性值不能包括&字符

<?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>

5.XML语法 - CDATA节

(注释同HTML)

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

1.语法:

<![CDATA[

这里可以把你输入的字符原样显示,不会解析xmI

]]>

2.可以输入任意字符(除]]>外)

3.不能嵌套

<?xml version="1.0" encoding="utf-8"?>
<!--
    <![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>
            ]]>
            <![CDATA[ 这里输入 ]]>
        </code>
    </stduent>
</students>

三、XML转义字符

1.对于一-些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理

<?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>

小结

遵循如下规则的XML文档称为格式正规的XML文档

1、XML声明语句<?xml version= "1.0" encoding= "utf-8"?>

2、必须有且仅有一一个根元素

3、标记大小,区分大小写的。

4、属性值用引号

5、标记成对

6、空标记关闭

7、元素正确嵌套

四、DOM4J

https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/xml API文档

1.XML解析技术的原理

1.不管是html文件还是xmI文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析

2. document对象表示的是整个文档( 可以是html文档,也可以是xmI文档)

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

1.dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析也做了实现

2. sun公司在JDK5版本对dom解析技术进行升级: SAX ( Simple API for XML ) SAX 解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。是一行一-行的读取xml文件进行解析的。不会创建大量的dom对象。所以它在解析xmI的时候,在性能上优于Dom解析

3.这两种技术已经过时,知道有这两种技术即可

4.第三方的XML解析技术

1. jdom在dom基础上进行了封装

2. dom4j又对jdom进行了封装。

3. pull主要用在Android手机开发,是在跟sax非常类似都是事件机制解析xmIl文件

2.DOM4J介绍

1. Dom4j是一个简单、灵活的开放源代码的库(用于解析/处理XNL文件)。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。

2.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些, 但它提供了比JDOM更好的灵活性。

3. Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j。

4.使用Dom4j开发,需下载dom4j相应的jar文件

3.获得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");

4.应用实例 - 增删改查(主要是查)

DEBUG底层

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

/**
 * @author 韩顺平
 * @version 1.0
 */
public class Dom4j_ {

    /**
     * 演示如何加载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
        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("更新成功~");
    }
}

对应的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>

5.课后作业

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

/**
 * @author 韩顺平
 * @version 1.0
 */
public class Homework {
    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/1288152.html

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

相关文章

synxflow 安装环境

介绍&#xff1a; 该软件可以动态模拟洪水淹没&#xff0c;滑坡跳动和泥石流使用多个cuda支持的gpu。它还提供了一个用户友好但多功能的Python界面&#xff0c;可以完全集成到数据科学工作流程中&#xff0c;旨在简化和加速危害风险评估任务。 这个包我从网上找到的资源特别特…

【WPF.NET开发】构造动态布局

本文内容 系统必备创建项目配置默认的 Grid Panel 控件向面板中添加控件测试布局汇总所有内容后续步骤 在动态定位中&#xff0c;您通过指定子元素相对于父元素应该如何排列以及应该如何包装来排列子元素。 您还可以将窗口和控件设置为在其内容扩展时自动扩展。 适用于 Vis…

Avalonia中使用Prism实现区域导航功能

前言 上一篇文章我们讲了在Avalonia开发中&#xff0c;引入Prism框架来完成项目的MVVM迁移。本章内容将带领大家学习如何在Avalonia中使用Prism框架实现区域导航功能。如果你还不知道Avalonia中如何引入Prism框架&#xff0c;请看我上一篇文章&#xff1a;Avalonia框架下面使用…

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时&#xff0c;往往会遇到数据库迁移的任务。如果数据量不是特别大&…

【unity3D】Transform组件(如何访问和获取Transform组件)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Transform组件 Transform组件 基础知识介绍三个成员变量常用属性扩展 Transform的相关查找方法静态方法 基础知识 介绍 在Unit…

ELK(一)—介绍

一、ELK介绍 ELK是指Elasticsearch、Logstash和Kibana&#xff0c;这三个开源软件构成了一个功能强大的日志管理和分析平台。Elasticsearch作为分布式搜索引擎&#xff0c;负责实时存储和检索大规模数据&#xff1b;Logstash用于从多个数据源采集、处理和传输日志数据&#xff…

分包(微信小程序)

首先&#xff0c;微信小程序中使用分包是为了减少首屏的请求&#xff0c;因为微信小程序会默认下载主包内的内容并展示到页面上&#xff0c;但是随着业务量的增加&#xff0c;代码量也会越来越大。会导致我们启动小程序的时候首页加载速度过慢的这个问题。这时我们就可以采用分…

dockerdesktop推送镜像到dockerhub

1.查看镜像(打开powershell) docker ps2.打tag docker tag pengzx/aspnetcoredocker:v1 pengzx/aspnetcoredocker:v2pengzx/aspnetcoredocker:v1:本地的镜像名加版本号 pengzx/aspnetcoredocker:v2&#xff1a;需要上传的镜像名&#xff08;要以dockerhub的用户名开头/本地镜像…

Data Linked UI

DataLinkedUl是一个Unity框架,它允许您在为您的应用程序创建用户界面时实现专业的数据驱动方法。使用此资产,您可以创建灵活的基于瓦片的任意大小的复杂接口系统。 核心功能: 灵活性-允许适应和调整数据变化,允许各种结构和功能配置,而不需要对现有系统进行重大破坏。 可伸…

HTTP之跨域

HTTP之跨域 跨域&#xff08;Cors&#xff09;两种请求简单请求浏览器不同的处理方式Access-Control-Allow-OriginAccess-Control-Allow-CredentialswithCredentials属性 非简单请求服务器回应&#xff1a;什么时候会触发OPTIONS&#xff08;预检请求&#xff09;呢&#xff1f…

ubuntu 20.04 server 安装 zabbix

ubuntu 20.04 server 安装 zabbix 参考文档 https://zhuanlan.zhihu.com/p/587415883?utm_id0 https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/ https://blog.csdn.net/ammc520/article/details/134279322 在Ubuntu 20.04上安装MySQL教程 https://b…

高防IP是什么? 防护CC 对抗DDOS

什么是DDoS高防IP&#xff1f; DDoS&#xff08;分布式拒绝服务&#xff09;攻击是指攻击者通过利用大量恶意流量向目标服务器发送请求&#xff0c;导致目标服务器无法正常处理合法用户的请求。DDoS高防IP是一种通过技术手段来应对DDoS攻击的解决方案。它能够过滤掉恶意流量&a…

算法 搜索

深度优先搜索 广度优先搜索 深搜与广搜的区别 深搜 dfs——回溯——“不撞南墙不回头” 思路 总的来说是不撞南墙不回头&#xff0c;相当于一个人严格按照固定的行为模式。 例如走方格&#xff0c;依次走上下左右&#xff0c;每次走到一个新格子记录自己已经走过的方向&am…

亿胜盈科ATR2037 无限射频前端低噪声放大器

亿胜盈科ATR2037 是一款应用于无线通信射频前端&#xff0c;工作频段为 0.7 到 6GHz 的超低噪声放大器。 ATR2037 低噪声放大器采用先进的 GaAs pHEMT 工艺设计和制作&#xff0c;ATR2037 低噪声放大器在整个工作频段内可以获得非常好的射频性能超低噪声系数。 亿胜盈科ATR203…

班级查分软件制作教程:老师必备技能!

首先&#xff0c;你需要选择一个合适的软件平台来制作班级查分软件。推荐使用群发成绩&#xff0c;因为它是一个功能强大且易于使用的在线查询系统&#xff0c;可以帮助你快速高效地制作班级查分软件​。 在制作班级查分软件之前&#xff0c;你需要准备好学生的成绩数据。这可以…

云原生的 CI/CD 框架tekton - pipeline(一)

文章目录 1. 官方介绍2. 组件2.1 Tekton Pipelines2.2 部署pipeline2.3 部署dashborad2.3.1 task2.3.2 taskrun2.3.3 Pipeline2.3.4 PipelineRun 3. 案例案例1: 拉取代码并查看readmestep1: 创建task - 拉取代码step2: 创建task - 查看reamdestep3: 创建task的编排 - pipelines…

函数递归。

文章目录 前言一、什么是递归二、递归的限制条件三、递归举例1.求n的阶乘2. 举例2&#xff1a;顺序打印一个整数的每一位 四、递归的优劣总结 前言 不多废话了&#xff0c;直接开始。 一、什么是递归 递归是学习C语言函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xf…

桥接网卡绑定

目录 1、创建一个桥接设备和会话 2、配置软件桥接网卡的IP地址、网关和地址获取方式 3、添加从设备和会话到桥接设备 4、启动从设备会话 5、启动桥接会话 ​ 桥接就是把一台机器上的若干个网络接口连接起来&#xff0c;其结果是&#xff0c;其中一个网卡收到的…

【Polar靶场WEB签到】

题目&#xff1a; <?phperror_reporting(0);$file $_GET[file];if(!isset($file))$file 1;$file str_replace(../, , $file);include_once($file.".php");highlight_file(__FILE__); ?>解答&#xff1a;1、进入index页面&#xff0c;说让你加弟弟&#x…

LeetCode:2477. 到达首都的最少油耗(DFS C++、Java)

目录 2477. 到达首都的最少油耗 题目描述&#xff1a; 实现代码与解析&#xff1a; dfs 2477. 到达首都的最少油耗 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 到 n…