01-XML-04XML处理

news2024/11/22 15:05:50

XML处理

  1. DOM
    DOM解析要求解析器将整个XML文件全部加载到内存中,生成一个Document对象。

    优点:元素和元素之间保留结构,关系,可以针对元素进行增删改查操作。

    缺点:如果XML文件过大,可能会导致内存溢出。
  2. SAX
    SAX解析是一种更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以时间驱动的方式进行具体的解析,每解析一行都会触发一个事件。

    优点:不会出现内存溢出的问题,可以处理大文件。

    缺点:只能读,不能写。
  3. 常见的解析XML类库
    解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员来解析XML,有一些方便操作的类库。具体如下所示:

    1.dom4j:比较简单的XML解析类库;

    2.Jsoup:功能强大的DOM方式解析的类库,尤其对HTML的解析更加方便,所以可以使用Jsoup来爬取网页的数据。

JDK内置DOM

XML文件

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <!-- book至少出现一次 -->
    <book>
        <!-- id -->
        <id>1</id>
        <!-- 书名 -->
        <name>《JAVA从入门到放弃》</name>
        <!-- 作者
            属性type:可选(man|woman)默认值 “man”
            属性age:必填属性
             -->
        <author type="man" age="23">张三</author>
    </book>
    <book>
        <id>2</id>
        <name>《这是一本书》</name>
        <author type="woman" age="32">李四</author>
    </book>
</books>

JDK内置DOM读XML

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

/**
 * JDK内置DOM读XML
 *
 * @author Anna.
 * @date 2024/3/31 17:42
 */
public class JavaDomReadDemo {

    public static void main(String[] args) throws Exception {
        new JavaDomReadDemo().read();
    }

    public void read() throws ParserConfigurationException, IOException, SAXException {
        // 获取资源路径
        String path = this.getClass().getResource("books.xml").getPath();
        // 获取文件判断文件是否存在
        File file = new File(path);
        if (!file.exists() || !file.isFile()) {
            throw new RuntimeException("获取资源失败");
        }

        // 从DocumentBuilderFactory获得DocumentBuilder。 DocumentBuilder包含用于从 XML 文档中获取 DOM 文档实例的 API。
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        // parse()方法将 XML 文件解析为Document
        Document doc = documentBuilder.parse(file);

        System.out.printf("根节点: %s", doc.getDocumentElement().getNodeName());

        // 循环打印
        NodeList nList = doc.getElementsByTagName("book");

        for (int i = 0; i < nList.getLength(); i++) {
            Node nNode = nList.item(i);
            System.out.println("");
            System.out.printf("元素: %s", nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                Element elem = (Element) nNode;
                String id = elem.getElementsByTagName("id").item(0).getTextContent();
                String name = elem.getElementsByTagName("name").item(0).getTextContent();
                Element authorNode = (Element) elem.getElementsByTagName("author").item(0);
                String author = elem.getElementsByTagName("author").item(0).getTextContent();
                String type = authorNode.getAttribute("type");
                String age = authorNode.getAttribute("age");
                System.out.println("");
                System.out.printf("id: %s - name:%s - author:%s[type=%s,age=%s]", id, name, author, type, age);
            }
        }
    }

}

执行结果

在这里插入图片描述

使用NodeIterator读取文本

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

/**
 * JDK内置DOM读XML
 * 使用NodeIterator读取文本
 *
 * @author Anna.
 * @date 2024/3/31 17:42
 */
public class JavaDomReadDemo2 {

    public static void main(String[] args) throws Exception {
        new JavaDomReadDemo2().read();
    }

    public void read() throws ParserConfigurationException, IOException, SAXException {
        // 获取资源路径
        String path = this.getClass().getResource("books.xml").getPath();
        // 获取文件判断文件是否存在
        File file = new File(path);
        if (!file.exists() || !file.isFile()) {
            throw new RuntimeException("获取资源失败");
        }

        // 从DocumentBuilderFactory获得DocumentBuilder。 DocumentBuilder包含用于从 XML 文档中获取 DOM 文档实例的 API。
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        // parse()方法将 XML 文件解析为Document
        Document doc = documentBuilder.parse(file);

        DocumentTraversal trav = (DocumentTraversal) doc;

        NodeIterator it = trav.createNodeIterator(doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true);

        for (Node node = it.nextNode(); node != null;
             node = it.nextNode()) {
            // 判断是否有属性
            if (node.hasAttributes()) {
                String attrStr = getAttrStr(node.getAttributes());
                System.out.printf("元素名称:%s-元素值:%s-属性:%s %n", node.getNodeName(), node.getTextContent(), "".equalsIgnoreCase(attrStr) ? "null" : attrStr, node.getNodeType());
            } else {
                System.out.printf("元素名称:%s-元素值:%s%n", node.getNodeName(), node.getTextContent());
            }
        }
    }

    private String getAttrStr(NamedNodeMap attributes) {
        StringBuffer sb = new StringBuffer();
        if (attributes != null && attributes.getLength() > 0) {
            sb.append("[");
            for (int i = 0; i < attributes.getLength(); i++) {
                Node item = attributes.item(i);
                sb.append(item.getNodeName()).append("=").append(item.getNodeValue()).append(" ");
            }
            sb.append("]");
        }
        return sb.toString();
    }
}

执行结果

在这里插入图片描述

使用NodeIterator读取文本自定义NodeFilter

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;

/**
 * JDK内置DOM读XML
 * 使用NodeIterator读取文本自定义NodeFilter
 * @author Anna.
 * @date 2024/3/31 17:42
 */
public class JavaDomReadDemo3 {

    public static void main(String[] args) throws Exception {
        new JavaDomReadDemo3().read();
    }

    public void read() throws ParserConfigurationException, IOException, SAXException {
        // 获取资源路径
        String path = this.getClass().getResource("books.xml").getPath();
        // 获取文件判断文件是否存在
        File file = new File(path);
        if (!file.exists() || !file.isFile()) {
            throw new RuntimeException("获取资源失败");
        }

        // 从DocumentBuilderFactory获得DocumentBuilder。 DocumentBuilder包含用于从 XML 文档中获取 DOM 文档实例的 API。
        DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        // parse()方法将 XML 文件解析为Document
        Document doc = documentBuilder.parse(file);

        DocumentTraversal trav = (DocumentTraversal) doc;

        NodeIterator it = trav.createNodeIterator(doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, new MyFilter(), true);

        for (Node node = it.nextNode(); node != null;
            node = it.nextNode()) {
            // 判断是否有属性
            if(node.hasAttributes()){
                String attrStr = getAttrStr(node.getAttributes());
                System.out.printf("元素名称:%s-元素值:%s-属性:%s %n", node.getNodeName(),node.getTextContent(),"".equalsIgnoreCase(attrStr) ? "null" : attrStr, node.getNodeType());
            }
            else {
                System.out.printf("元素名称:%s-元素值:%s%n", node.getNodeName(),node.getTextContent());
            }
        }
    }

    private String getAttrStr(NamedNodeMap attributes){
        StringBuffer sb = new StringBuffer();
        if(attributes != null && attributes.getLength() > 0){
            sb.append("[");
            for(int i = 0; i < attributes.getLength(); i++){
                Node item = attributes.item(i);
                sb.append(item.getNodeName()).append("=").append(item.getNodeValue()).append(" ");
            }
            sb.append("]");
        }
        return sb.toString();
    }

    /**
     * 自定义过滤器
     *  实现NodeFilter接口
     *  通过返回NodeFilter.FILTER_ACCEPT和NodeFilter.FILTER_REJECT来控制要使用的节点
     * @author Anna.
     * @date 2024/3/31 18:50
     */
    static class MyFilter implements NodeFilter {
        @Override
        public short acceptNode(Node thisNode) {
            if (thisNode.getNodeType() == Node.ELEMENT_NODE) {
                Element e = (Element) thisNode;
                String nodeName = e.getNodeName();
                if ("author".equals(nodeName)) {
                    return NodeFilter.FILTER_ACCEPT;
                }
            }
            return NodeFilter.FILTER_REJECT;
        }
    }
}

执行结果

在这里插入图片描述

JDK内置DOM写XML

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * JDK内置DOM写XML
 *
 * @author Anna.
 * @date 2024/3/31 17:42
 */
public class JavaDomWriteDemo {

    public static void main(String[] args) throws Exception {
        new JavaDomWriteDemo().write();
    }

    public void write() throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();

        // 创建根节点
        Element root = doc.createElementNS("", "books");
        doc.appendChild(root);
        // 设置子元素
        Map<String, String> book1 = new HashMap<String, String>();
        book1.put("type", "man");
        book1.put("age", "34");
        root.appendChild(createBook(doc, "1", "《JAVA从入门到放弃》", "张三", book1));
        Map<String, String> book2 = new HashMap<String, String>();
        book2.put("type", "man");
        book2.put("age", "34");
        root.appendChild(createBook(doc, "2", "《这是一本书》", "李四", book2));

        // Java DOM 使用Transformer生成 XML 文件。 之所以称为转换器,是因为它也可以使用 XSLT 语言转换文档。
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transf = transformerFactory.newTransformer();

        // 设置文档的编码和缩进
        transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transf.setOutputProperty(OutputKeys.INDENT, "yes");
        transf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

        // DOMSource保存 DOM 树
        DOMSource source = new DOMSource(doc);
        // 获取资源路径
        String path = System.getProperty("user.dir") + File.separator + "01-xml-04-xml-handle/java-dom-demo/src/main/resources";
        File myFile = new File(path + File.separator + "books2.xml");

        StreamResult console = new StreamResult(System.out);
        StreamResult file = new StreamResult(myFile);

        // 写入控制台和文件
        transf.transform(source, console);
        transf.transform(source, file);
    }

    /**
     * 创建Book
     * e
     *
     * @param doc
     * @param id
     * @param name
     * @param author
     * @return org.w3c.dom.Node
     * @author Anna.
     * @date 2024/3/31 19:03
     */
    private static Node createBook(Document doc, String id, String name, String author, Map<String, String> attrsMap) {
        Element book = doc.createElement("book");
        book.setAttribute("id", id);
        book.appendChild(createUserElement(doc, "id", id, null));
        book.appendChild(createUserElement(doc, "name", name, null));
        book.appendChild(createUserElement(doc, "author", author, attrsMap));
        return book;
    }

    /**
     * 创建子节点
     *
     * @param doc
     * @param name
     * @param value
     * @param attrsMap
     * @return org.w3c.dom.Node
     * @author Anna.
     * @date 2024/3/31 19:02
     */
    private static Node createUserElement(Document doc, String name, String value, Map<String, String> attrsMap) {
        Element node = doc.createElement(name);
        node.appendChild(doc.createTextNode(value));

        if (attrsMap != null && attrsMap.size() > 0) {
            for (Map.Entry entry : attrsMap.entrySet()) {
                node.setAttribute(entry.getKey().toString(), entry.getValue().toString());
            }
        }

        return node;
    }
}

执行结果

在这里插入图片描述

DOM4J读写XML

引入MAVEN坐标

<dependency>
   <groupId>org.dom4j</groupId>
   <artifactId>dom4j</artifactId>
   <version>2.1.3</version>
</dependency>

SAX读XML

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

import java.io.File;
import java.util.Iterator;

/**
 * SAX读XML文件
 *
 * @author Anna.
 * @date 2024/3/31 19:40
 */
public class SaxReadDemo {

    public static void main(String[] args) {
        new SaxReadDemo().read();
    }

    public void read() {
        // 获取资源路径
        String path = this.getClass().getResource("books.xml").getPath();
        // 获取文件判断文件是否存在
        File file = new File(path);
        if (!file.exists() || !file.isFile()) {
            throw new RuntimeException("获取资源失败");
        }

        // 1 创建SAXReader对象,用于读取XML文件
        SAXReader saxReader = new SAXReader();
        // 读取XML文件,得到document对象
        try {
            Document document = saxReader.read(new File(path));
            // 获取根元素
            Element rootElement = document.getRootElement();
            System.out.println("根元素名称:" + rootElement.getName());
            // 获取根元素下所有子元素
            Iterator<?> iterator = rootElement.elementIterator();
            while (iterator.hasNext()) {
                // 取出元素
                Element element = (Element) iterator.next();
                System.out.println("子元素名称:" + element.getName());
                // 获取子元素
                Element id = element.element("id");
                Element name = element.element("name");
                Element author = element.element("author");

                System.out.printf("子元素的子元素值-id:%s -name: %s --author:%s[type=%s,age=%s]%n",
                        id.getStringValue(), name.getText(),
                        author.getText(),
                        // 获取author属性type
                        author.attribute("type").getValue(),
                        // 获取author属性age
                        author.attribute("age").getValue());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

执行结果

在这里插入图片描述

DOM4J写XML

Dom4j的常用API说明

方法操作
Element getRootElement();获取XML文件的根节点
String getName();返回标签的名称
List < Element > elements();获取标签所有的子标签
String arrtributeVallue(String name) ;获取指定属性名称的属性值
String getText();获取标签的文本
String elementText(String name);获取指定名称的子标签的文本,返回子标签文本的值
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Dom4j写XML文件
 *
 * @author Anna.
 * @date 2024/3/31 19:40
 */
public class Dom4jWriteDemo {

    public static void main(String[] args) {
        String path = System.getProperty("user.dir") + File.separator + "01-xml-04-xml-handle/dom4j-demo/src/main/resources";
        new Dom4jWriteDemo().write(path + File.separator + "books2.xml");
    }

    public void write(String path) {
        // 通过documentHelper生成一个Documen对象
        Document document = DocumentHelper.createDocument();
        // 添加并得到根元素
        Element books = document.addElement("books");
        // 为根元素添加子元素
        Element book = books.addElement("book");
        // 为book添加子元素
        Element id = book.addElement("id");
        Element name = book.addElement("name");
        Element author = book.addElement("author");
        // 为子元素添加文本
        id.addText("1");
        name.addText("《Java自学基础》");
        author.addText("张三");
        author.addAttribute("type", "man");
        author.addAttribute("age", "12");
        // 将DOC输出到XML文件 简单输出
//        Writer writer = null;
//        try {
//            writer = new FileWriter(new File(path));
//            document.write(writer);
//            // 关闭资源
//            writer.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            if (writer != null) {
//                try {
//                    writer.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
        // 美化格式输出
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = null;
        try {
            xmlWriter = new XMLWriter(new FileWriter(new File(path)), format);
            xmlWriter.write(document);
            // 关闭资源
            xmlWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (xmlWriter != null) {
                try {
                    xmlWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

执行结果

在这里插入图片描述

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

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

相关文章

自动驾驶之心规划控制笔记

Search-based Path Planning Methods Path Finding Problem 一般来说指标有距离,耗费时间,能量,或者多目标。 左图是拓扑地图,蓝色的点就是顶点,绿色的线是连接关系。最后得到的是一个从哪里走的一个最优,并非精细解。 右图是栅格地图,这个搜索出来的是在相对分辨率比…

vue快速入门(四)v-html

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用v-html将文本以html的方式显示 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, …

147.【2024Java八股-全网最全-10w字】

100道Java经典面试题 (一)、准备篇1.HR如何筛选简历?2.部门负责人如何筛选简历?3.简历模块布局4.应届生如何找到合适的练手项目?5.深入学习哪些业务模块呢?6.Java程序员的面试过程 (二)、Redis篇1.redis经常使用在哪些场景?2.Redis进行查询的流程是什么?3.什么是缓存穿透…

软件设计师28--SQL语言

软件设计师28--SQL语言 考点1&#xff1a;普通查询SQL语言SQL语言 - 查询例题&#xff1a; 考点2&#xff1a;分组查询SQL语言 - 查询例题&#xff1a; 考点3&#xff1a;权限控制SQL语言例题&#xff1a; 考点1&#xff1a;普通查询 SQL语言 SQL语言 - 查询 例题&#xff1a;…

又一AI工具开源!企业应该如何搭上这趟AI快车

大模型技术在近两年来飞速发展&#xff0c;企业对大模型的认知更加理性、务实。大模型本身不会直接产生价值&#xff0c;但在大模型基础架构之上开发出的AI应用&#xff0c;带来技术创新及业务增长&#xff0c;成为企业真正关心的问题。 基于大模型开发的又一个AI工具诞生&…

基于JSP的农产品供销服务系统

背景 互联网的迅猛扩张彻底革新了全球各类组织的运营模式。自20世纪90年代起&#xff0c;中国的政府机关和各类企业便开始探索利用网络系统来处理管理事务。然而&#xff0c;早期的网络覆盖范围有限、用户接受度不高、互联网相关法律法规不完善以及技术开发不够成熟等因素&…

企业动态|同创永益中标人保集团2023年混沌工程平台采购项目

2024年1月&#xff0c;经过严格的技术评审和商务洽谈&#xff0c;同创永益从众多厂商中脱颖而出&#xff0c;以综合评分第一名的佳绩一举拔得头筹&#xff0c;成功中标人保集团2023年混沌工程平台采购项目&#xff0c;本项目是同创永益混沌工程平台首次在保险公司内应用。人保集…

理解main方法的语法

由于JVM需要调用类的main()方法&#xff0c;所以该方法的访问权限必须是public&#xff0c;又因为JVM在执行main()方法时不必创建对象&#xff0c;所以该方法必须是static的&#xff0c;该方法接收一个String类型的数组参数&#xff0c;该数组中保存执行Java命令时传递给所运行…

工业互联网网关软件分析与设计

一、 案例软件分析 一、总体目标 工业互联网是新一代信息技术与制造业深度融合形成的新兴业态和应用模式&#xff0c;其发展前景广阔。工业互联网网关是将各采集监测点的数据通过无线或有线传感网络进行数据汇集&#xff0c;进行统一有效的监管。在工业互联网体系架构中&…

隐语SecretFlow实训营-第8讲:快速上手隐语SCQL的开发实践

SCQL使用/集成实践 目前SCQL只开放API供用户使用/集成 使用SCDBClient上手体验可以基于SCQL API开发封装白屏产品&#xff0c;或集成到业务链路中 使用流程&#xff1a; 部署系统 环境配置&#xff1a; 机器配置&#xff1a;CPU/MEM最低8C16G机构之间的网络互通 镜像&…

【面试HOT200】链表篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试coding部分的&#xff0c;整理期间苛求每个算法题目&#xff0c;平衡可读性与代码性能&#xff08;leetcode运行复杂度均打败80%以上&#xff09;。 &#x1f970;来源&#xff1a;材料主要源于…

25+web技术站点,事半功倍,总有一个值得got

前言 收集一些有用的网站&#xff0c;为自己用&#xff0c;也分享一下&#xff0c;仅此而已。 ECMA 国际组织 各种文案 Ecma-262 - ECMAScript 规范Ecma-402&#xff0c; -国际化 API 规范Ecma-404 - JSON 数据交换语法ECMA-419 - 嵌入式系统 API 规范ECMA-414 规定了和 ECM…

数据挖掘|关联分析与Apriori算法详解

数据挖掘|关联分析与Apriori算法 1. 关联分析2. 关联规则相关概念2.1 项目2.2 事务2.3 项目集2.4 频繁项目集2.5 支持度2.6 置信度2.7 提升度2.8 强关联规则2.9 关联规则的分类 3. Apriori算法3.1 Apriori算法的Python实现3.2 基于mlxtend库的Apriori算法的Python实现 1. 关联分…

比较靠谱的测试进度报告

在测试的过程中&#xff0c;不要等领导过问&#xff0c;有一份比较靠谱的测试进度报告&#xff0c;让关心和支持项目的干系人心里有谱&#xff0c;有利于管理层对项目的监控和资源的支持&#xff0c;有利于项目团队成员之间沟通协调&#xff0c;及时发现问题利于项目风险控制等…

Docker 笔记

1.Ubuntu安装Docker 安装Docker看这篇文章 http://t.csdnimg.cn/IsSsJ 2.在docker中运行python代码 2.1搭建python环境 docker部署python环境看这篇文章 http://t.csdnimg.cn/TYz0G 2.2在python shell中运行python代码 2.2.1查看镜像 2.2.1启动python&#xff0c;厦门这个…

ABC318 F - Octopus

解题思路 对于每个宝藏维护个区间&#xff0c;答案一定在这些区间中对于每个区间的端点由小到大排序对于每个点进行判断&#xff0c;若当前位置合法&#xff0c;则该点一定为一个右端点则该点到前一个端点之间均为合法点若前一个点不合法&#xff0c;则一定是某一个区间限制的…

【Linux】详解动静态库的制作和使用动静态库在系统中的配置步骤

一、库的作用 1、提高开发效率&#xff0c;让开发者所有的函数实现不用从零开始。 2、隐藏源代码。 库其实就是所有的.o文件用特定的方式进行打包形成一个文件&#xff0c;各个.o文件包含了源代码中的机器语言指令。 二、动态库和静态库的制作和使用 2.1、静态库的制作和使用…

【学习笔记】java项目—苍穹外卖day03

文章目录 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新…

【代码随想录】数组

704. 二分查找 class Solution {public int search(int[] nums, int target) {if(numsnull || nums.length0){return -1;}return searchTarget(nums, 0, nums.length-1, target);}private int searchTarget(int[] nums, int left, int right, int target){//left和right都指向同…

RegionCLIP网络结构解析 Region-based Language-Image Pretraining

1、简单介绍 主要是关注目标检测方面的工作&#xff0c;现在纯CV已经前景黯淡&#xff0c;即使前段时间的YOLOv9发布也是关注一般。 现在大模型已成热点&#xff0c;而大模型要求的数据量和算力和算法复杂度&#xff0c;显然让很多人却步。但是具有大模型特点的多模态算法也算…