dom4j解析 mybatis config XML文件

news2024/9/20 14:58:21

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wsd</groupId>
    <artifactId>parse-xml</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--dom4j依赖-->
        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!--jaxen依赖-->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!--junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

 

dom4j是一个开源的Java XML解析库,它的主要作用是用于处理和操作XML文档。

以下是dom4j的一些主要作用和特性:

1. 解析和读取XML文档:dom4j提供了一个简单而强大的API,使得解析和读取XML文档变得容易。它可以将XML文档转换为类似于树形结构的对象模型,开发者可以通过该对象模型轻松地获取和操作XML文档中的元素、属性和文本内容。

2. 查询和筛选XML元素:dom4j支持使用XPath和自定义的查询方式来查询和筛选XML文档中的特定元素。开发者可以使用XPath表达式或者编程方式来根据条件筛选所需的XML元素,从而方便地进行数据的提取和操作。

3. 创建和生成XML文档:dom4j提供了创建和生成XML文档的功能。开发者可以使用dom4j的API来动态地构建XML文档结构,添加元素、属性和文本内容,并将最终的XML文档保存到文件或输出流中。

4. 支持XML文档的验证和验证:dom4j提供了验证XML文档的功能,可以通过指定DTD或XML Schema进行验证。这有助于确保所处理的XML文档符合预期的结构和规范。

5. 高性能和低内存占用:dom4j被设计为高性能和低内存占用的XML解析库。它使用了一些优化技术,如基于事件的解析模型,以提高解析性能和降低内存使用。

总的来说,dom4j是一个功能强大且易于使用的XML解析库,可以帮助开发者轻松地处理和操作XML文档,包括解析、读取、查询、创建和生成XML文档,以及验证等功能。它在Java开发中被广泛应用于处理和操作XML数据。

Jaxen是一个用于XPath查询的开源Java库,它的主要作用是提供一种简单而强大的方式来在XML文档中进行查询和筛选。

以下是Jaxen的一些主要作用和特性:

1. XPath查询:Jaxen实现了XPath标准,使得开发者可以使用XPath表达式在XML文档中定位和筛选特定的元素、属性或文本节点。XPath是一种基于路径表达式的查询语言,使用它可以非常灵活地定位和筛选XML文档中的数据。

2. 符合标准:Jaxen严格遵循XPath标准,并提供了一致的API和语法规则。开发者可以依赖Jaxen来执行各种XPath查询操作,而不需要关注不同XML解析库之间的差异和特性。

3. 跨平台支持:Jaxen是一个跨平台的Java库,可以在各种Java环境下使用,包括标准的Java SE、Java EE和Android等。这使得开发者可以在不同的平台和应用中灵活地使用Jaxen进行XPath查询。

4. 支持多种XML解析器:Jaxen提供了对多种XML解析器的支持,包括DOM、JDOM、dom4j和XPath的内置实现。开发者可以根据自己的需求和项目环境选择适合的XML解析器,而无需修改或适配现有的XPath查询代码。

5. 高性能和可扩展:Jaxen被设计为高性能和可扩展的XPath查询库。它使用了一些优化技术和算法,以提高查询性能,并提供了一些扩展点和API,以便开发者可以根据需要自定义和扩展Jaxen的功能。

综上所述,Jaxen是一个用于XPath查询的Java库,它提供了一种简单和强大的方式来在XML文档中进行查询和筛选。它的主要作用是帮助开发者方便地执行XPath查询,并从XML文档中获取所需的数据。Jaxen在Java开发中被广泛应用于处理和操作XML数据。

config.xml

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <environment id="dev2">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/myspring"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
        <mappers>
            <mapper resource="CarMapper.xml"/>
        </mappers>
    </environments>
</configuration>

 CarMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="car">
    <!--insert sql:保存一个汽车信息-->
    <insert id="insertCar">
        insert into t_car
            (id,car_num,brand,guide_price,produce_time,car_type)
        values
            (null,#{carNum},#{brand},#{guidePrice},#{produceTime},#{carType})
    </insert>

</mapper>

test01:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");
        
        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);
        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
        
        System.out.println( document );

    }
}

 

 

在dom4j库中,SAXReader类是一个用于解析XML文档的工具类。它提供了多个读取和解析XML文档的方法,其中包括了`read(InputStream)`方法。

`read(InputStream)`方法用于从给定的输入流中读取并解析XML文档。下面是对这个方法的解析介绍:

方法签名:
public Document read(InputStream inputStream) throws DocumentException
 

参数:
- `inputStream`:要读取的XML文档的输入流。

返回值:
- 解析后得到的Document对象,表示整个XML文档的根节点。

异常:
- `DocumentException`:如果解析XML文档时发生了错误。

方法功能:
- `read(InputStream)`方法通过使用SAX解析器,从输入流中读取XML文档的内容,并将其解析为一个dom4j的Document对象。
- SAX解析器是一种基于事件驱动的解析器,它在解析过程中逐行读取并处理XML数据,而不是将整个XML文档加载到内存中。

解析过程:
1. `read(InputStream)`方法会创建一个SAX解析器对象,并设置解析器的配置选项。
2. 解析器会逐行读取输入流中的XML文档数据。
3. 当解析器读取到XML文档的各个节点(例如元素、属性、文本等)时,会触发相应的事件。
4. 解析器根据事件类型,通过回调方法将解析到的节点信息传递给SAXReader对象。
5. SAXReader对象将解析到的节点信息构建为一个dom4j的Document对象,并返回解析结果。

使用示例:
```java
// 创建SAXReader对象
SAXReader reader = new SAXReader();

// 从输入流中读取并解析XML文档
Document document = reader.read(inputStream);
```

总结:
`read(InputStream)`方法通过使用SAX解析器,从输入流中读取并解析XML文档。它返回一个dom4j的Document对象,表示整个XML文档的根节点。这个方法在dom4j中是常用的解析XML文档的方式之一,适用于处理较大的XML文件,因为它可以边读取边解析,避免将整个XML文档加载到内存中。

test02: 

package com.wsd;

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

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);
            //获取根节点
            Element rootElement = document.getRootElement();
            System.out.println( rootElement );
            
            String name = rootElement.getName();
            System.out.println("rootElementName:" + name);
        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
        
        
        

    }
}

test03:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            Node environments = document.selectSingleNode(xpath);
            System.out.println(environments);

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

 

 

 test04:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element environments = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String def = environments.attributeValue("default");
            System.out.println(def);

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

 

 

`document.selectSingleNode()`是dom4j库中用于查询XML文档中单个节点的方法。它根据给定的XPath表达式从XML文档中选择并返回匹配的第一个节点。

下面是一个具体的例子来详细解释`document.selectSingleNode()`方法的使用:

假设我们有一个名为"config.xml"的XML文档,其内容如下:
```xml
<root>
  <element1>Value 1</element1>
  <element2>Value 2</element2>
  <element3>Value 3</element3>
</root>
```

现在我们想通过XPath表达式来选择并获取"element2"节点的值。可以使用以下代码来实现:
```java
SAXReader reader = new SAXReader();
InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");
Document document = reader.read(xmlInputStream);

Node node = document.selectSingleNode("/root/element2");
String value = node.getText();

System.out.println(value);
```

解析过程如下:
1. 创建一个SAXReader对象。
2. 通过资源加载器获取名为"config.xml"的XML文件的输入流。
3. 使用SAXReader的`read()`方法将输入流解析为一个Document对象。
4. 使用`document.selectSingleNode()`方法,传入XPath表达式"/root/element2",来选择匹配的第一个节点。
5. 通过`getText()`方法获取选定节点的文本内容("Value 2")。
6. 将节点的值打印输出。

上述代码中,XPath表达式"/root/element2"选择了根节点下的"element2"子节点。由于使用了`selectSingleNode()`方法,它只会返回匹配的第一个节点(如果有多个匹配,只返回第一个)。使用`getText()`方法获取节点的文本内容,最后输出"Value 2"。

总结:
`document.selectSingleNode()`方法通过XPath表达式选择匹配的第一个节点,并返回该节点。你可以使用此方法来从XML文档中选择并获取你感兴趣的节点,进而操作节点的属性、文本内容等信息。

XPath表达式 :

XPath(XML Path Language)表达式是一种用于在XML文档中定位、选择和操作节点的语言。它是一种基于树结构的路径表达语言。

XPath表达式可以使用不同的语法形式,但最常见的形式是使用斜杠(/)分隔节点层级的路径。下面是XPath表达式的一些常见使用方式:

- `/`:表示根节点。例如,`/root`表示选择文档的根元素为root的节点。
- `//`:表示从根节点开始的全局搜索。例如,`//element`表示搜索文档中所有名为element的节点。
- `element`:表示选择指定名称的元素节点。例如,`element`表示选择所有名为element的节点。
- `@attribute`:表示选择节点的属性。例如,`@id`表示选择具有id属性的节点。
- `[predicate]`:表示使用谓词进行条件选择。例如,`element[@attr='value']`表示选择具有attr属性且属性值为"value"的element节点。

XPath还支持其他功能,如选择子节点、选择父节点、选择兄弟节点、选择前后节点等。它提供了丰富的选择器和操作符,使得在XML文档中选择和定位节点更加灵活和精确。

XPath表达式在许多XML处理库、工具和技术中都得到了广泛应用,包括dom4j、XPath语法、XSLT转换、XQuery等。通过使用XPath表达式,你可以快速而准确地定位和选择XML文档中的节点,以满足你的需求。

test05:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element environments = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String def = environments.attributeValue("default");

            //environments 下的 id= def 的 environment标签
            xpath = "/configuration/environments/environment[@id='" + def + "']";
            Element environment = (Element) document.selectSingleNode(xpath);
            System.out.println(environment);

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

 

 

 test06:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element environments = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String def = environments.attributeValue("default");

            //environments 下的 id= def 的 environment标签
            xpath = "/configuration/environments/environment[@id='" + def + "']";
            Element environment = (Element) document.selectSingleNode(xpath);

            // 获取 transactionManager 子节点
            Element transactionManager = environment.element("transactionManager");

            //获取 type 属性
            String  transactionManagerType = transactionManager.attributeValue("type");

            System.out.println(transactionManagerType);

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

 

test07:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element environments = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String def = environments.attributeValue("default");

            //environments 下的 id= def 的 environment标签
            xpath = "/configuration/environments/environment[@id='" + def + "']";
            Element environment = (Element) document.selectSingleNode(xpath);

            // 获取 transactionManager 子节点
            Element transactionManager = environment.element("transactionManager");
            //获取 type 属性
            String  transactionManagerType = transactionManager.attributeValue("type");

            //获取 dataSource 子节点
            Element dataSource = environment.element("dataSource");
            //获取 type属性
            String dataSourceType = dataSource.attributeValue("type");

            System.out.println(dataSourceType);

        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

 

test08:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element environments = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String def = environments.attributeValue("default");

            //environments 下的 id= def 的 environment标签
            xpath = "/configuration/environments/environment[@id='" + def + "']";
            Element environment = (Element) document.selectSingleNode(xpath);

            // 获取 transactionManager 子节点
            Element transactionManager = environment.element("transactionManager");
            //获取 type 属性
            String  transactionManagerType = transactionManager.attributeValue("type");

            //获取 dataSource 子节点
            Element dataSource = environment.element("dataSource");
            //获取 type属性
            String dataSourceType = dataSource.attributeValue("type");

            //获取 dataSource 下的所有子节点
            List<Element> dataSourcePropertyElements = dataSource.elements();
            //获取 property 标签的属性值
            dataSourcePropertyElements.forEach(property -> {
                String name = property.attributeValue("name");
                String value = property.attributeValue("value");
                System.out.println(name + " = " + value);
            });



        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

test09:

package com.wsd;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * @program: spring_learn
 * @description:
 * @author: Mr.Wang
 * @create: 2023-06-20 21:48
 **/
public class TestXml {

    @Test
    public void testParseConfigXml(){
        // 创建 SAXReader 对象
        SAXReader xReader = new SAXReader();

        //获取xml文件的输入流
        InputStream xmlInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("config.xml");

        Document document = null;
        try{
            //利用xml的输入流来解析xml文件,返回Document对象
            document = xReader.read(xmlInputStream);

            //获取environments 标签
            String xpath = "/configuration/environments";
            /*selectSingleNode 返回类型为 Node,
            将其强转为 Element(Element 是 Node 的子类),为了使用Element更多的方法
             */
            Element environments = (Element) document.selectSingleNode(xpath);

            //获取属性值
            String def = environments.attributeValue("default");

            //environments 下的 id= def 的 environment标签
            xpath = "/configuration/environments/environment[@id='" + def + "']";
            Element environment = (Element) document.selectSingleNode(xpath);

            // 获取 transactionManager 子节点
            Element transactionManager = environment.element("transactionManager");
            //获取 type 属性
            String  transactionManagerType = transactionManager.attributeValue("type");

            //获取 dataSource 子节点
            Element dataSource = environment.element("dataSource");
            //获取 type属性
            String dataSourceType = dataSource.attributeValue("type");

            //获取 dataSource 下的所有子节点
            List<Element> dataSourcePropertyElements = dataSource.elements();
            //获取 property 标签的属性值
            dataSourcePropertyElements.forEach(property -> {
                String name = property.attributeValue("name");
                String value = property.attributeValue("value");
                //System.out.println(name + " = " + value);
            });

            //mapper 标签
            xpath = "//mapper";
            //获取所有mapper标签
            List<Node> mapperNodes = document.selectNodes(xpath);
            //遍历获取mapper的属性
            mapperNodes.forEach(
                    mapper -> {
                        Element mapperElement = (Element) mapper;
                        String resource = mapperElement.attributeValue("resource");
                        System.out.println("resource = " + resource);
                    }
            );


        }
        catch ( DocumentException e){
            e.printStackTrace();
        }
    }
}

 

 

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

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

相关文章

软件工程——第4章形式化说明技术(非重点)

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.软件工程方法划分成哪三类&#xff1f;并各自举例 2.形式化方法的定义&#xff1f; 3.非形式化的方法的缺点&#xff1f; 4.形式化方法的优点&am…

elasticsearch snapshot快照指定多个索引并行备份——筑梦之路

Curl 命令方式对elasticsearch备份和恢复—— 筑梦之路_筑梦之路的博客-CSDN博客 之前也写过使用API请求的方式对ES数据进行快照方式备份&#xff0c;这里主要对之前的内容进行完善和补充。 版本兼容性 快照包含构成索引的磁盘上数据结构的副本。这意味着快照只能还原为可以读…

Kubernetes API Server源码学习(二):OpenAPI、API Resource的装载、HTTP Server具体是怎么跑起来的?

本文基于Kubernetes v1.22.4版本进行源码学习 6、OpenAPI 1&#xff09;、OpenAPI的作用 OpenAPI是由Swagger发展而来的一个规范&#xff0c;一种形式化描述Restful Service的语言&#xff0c;便于使用者理解和使用一个Service。通过OpenAPI规范可以描述一个服务&#xff1a;…

28离散Hopfield神经网络的联想记忆数字识别(附matlab)

1.简述 学习目标&#xff1a;利用离散Hopfield神经网络进行联想记忆数字识别 1982年&#xff0c;美国加州理工学院的J.Hopfield教授提出了一种单层反馈神经网络&#xff0c;称为Hopfield网络[1]。Hopfield网络是一种循环的神经网络&#xff0c;从输出到输入有反馈连接。Hopfiel…

Leetcode---350周赛

题目列表 6901. 总行驶距离 6890. 找出分区值 6893. 特别的排列 6447. 给墙壁刷油漆 一、总行驶距离 很显然&#xff0c;这题单纯就是一道数学应用题&#xff0c;我们要明白最关键的一点 &#xff1a;只有当mainTank>5并且additionalTank>0时&#xff0c;才能发生副油…

操作系统 - 操作系统结构

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Kubernetes资源篇】StatefulSet无状态服务管理入门实战详解

文章目录 一、StatefulSet理论知识1、StatefulSet Pod控制器特性2、什么是有状态服务和无状态服务&#xff1f;3、Deployment和StatefulSet区别 二、案例&#xff1a;StatefulSet资源实战演示1、创建WEB站点并验证StatefulSet特点2、StatefulSet滚动更新 三、总结 一、Stateful…

JavaFX第四篇 Button按钮和事件处理

JavaFX第四篇 Button按钮和事件处理 1. 代码2. 讲解3. 代码仓库 上一篇我们讲解了Hello World演示&#xff0c;主要用到Label标签的功能&#xff0c; 这里我们要介绍的是最常用的控件之一&#xff1a;按钮 在现在的软件开发过程中还没发现没有用到按钮的应用&#xff0c; 基本上…

【数据库原理与实践】第八章至第十章作业汇总(更新中)

填空题部分&#xff1a; Chp 8 安全性与完整性 part 1&#xff1a; 数据库的安全性是指保护数据库以防止不合法的使用所造成的&#xff08; 数据泄露、更改或破坏 &#xff09;。计算机系统有三类安全性问题&#xff0c;即&#xff08; 技术安全 &#xff09;、管理安全和…

ROS:计算图

目录 一、ROS计算图简介二、节点&#xff08;Node&#xff09;三、节点管理器&#xff08;Master&#xff09;四、消息&#xff08;Message&#xff09;五、话题&#xff08;Topic&#xff09;六、服务&#xff08;Service&#xff09;七、动作&#xff08;Action&#xff09;八…

LabVIEW开发燃油阀自动性能测试系统

LabVIEW开发燃油阀自动性能测试系统 燃油阀是航空燃油控制系统的核心部件。燃油阀的流量滞后直接影响控制精度、稳定性和可靠性&#xff0c;而燃油阀生产的性能测试是至关重要的步骤。但是&#xff0c;由于流动滞后是非线性的&#xff0c;因此很难控制和进行实时测试。随着厂家…

CSS3-浮动

&#xff08;了解&#xff09;标准流&#xff1a;又称文档流&#xff0c;是浏览器在渲染显示网页内容时默认采用的一套排版规则&#xff0c;规定了应该以何种方式排列元素 常见标准流排版规则&#xff1a; 1. 块级元素&#xff1a;从上往下&#xff0c;垂直布局&am…

Matplotlib---柱形图

1. 绘制简单的柱状图 bar函数用于绘制柱状图。下面是bar函数的语法格式&#xff1a; bar(x, height, width0.8, bottomNone, aligncenter, dataNone, **kwargs)参数解释&#xff1a; x&#xff1a;指定每个柱子的x轴坐标。height&#xff1a;指定每个柱子的高度。width&…

TypeScript ~ 掌握基本类型 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

vue的学习

title: VUE 一、Vue简介 1.1 简介 ::: tip Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式的js框架&#xff0c;发布于 2014 年 2 月。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0…

F. Gardening Friends(树的直径)

Problem - 1822F - Codeforces 两位朋友Alisa和Yuki在他们的花园里种了一棵有n个顶点的树。树是一个无向图&#xff0c;没有循环、回路或多重边。这棵树中的每条边都有一个长度为k。最初&#xff0c;顶点1是树的根。 Alisa和Yuki种植这棵树不仅仅是为了好玩&#xff0c;而是想…

基于SpringBoot的流浪动物救助平台

1.引言 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于流浪动物救助平台所牵扯的管理及数据保存都是非常多的&#xff0c;例如首页、个人中心、会员管理、志愿者管理、流浪动物信息管理、领养信息管理、取消领养信息管理、志愿团队活动管理、志愿者申请表管理、…

【性能设计篇】数据库拓展

前两篇文章介绍了分布式存储的机制&#xff0c;为保证数据的高性能以及可拓展&#xff0c;采用分片/分区机制。为保证数据的高可用性&#xff0c;采用复制/镜像机制存储数据。一份数据存储多份。而这两种方式在数据中&#xff0c;就是分片/分区机制。分库分表/读写分离。 读写…

掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别

Flutter动机是什么&#xff0c;解决啥痛点&#xff1f;优势在哪里&#xff1f; 介绍Flutter的历史背景和运行机制&#xff0c;并以界面渲染过程为例与你讲述其实现原理。 1 Flutter的历史背景 为不同的操作系统开发拥有相同功能的应用程序&#xff0c;开发人员只有两个选择&…

gitTortoise图形化工具下载步骤

一&#xff0c;简介 本文主要介绍如何下载安装gitTortoise图形化工具来管理和提交代码。 二&#xff0c;步骤介绍 2.1 安装包下载 下载地址&#xff1a;https://download.tortoisegit.org/tgit/ 打开后&#xff0c;界面如下&#xff1a; 点击选择最新的稳定release版本&am…