JAXP进行DOM和SAX解析

1.常用XML的解析方式:DOM和SAX

1)DOM思想:将整个XML加载内存中,形成文档对象,所以对XML操作都对内存中文档对象进行。

2)SAX思想:一边解析,一边处理,一边释放内存资源---不允许在内存中保留大规模XML数据

3)DOM和SAX的区别

DOM:支持回写,会将整个XML载入内存,以树形结构方式存储

            XML比较复杂的时候,或者当你需要随机处理文档中数据的时候不建议使用

SAX:相比DOM是一种更为轻量级的方案

          无法在读取过程中修改XML数据

2.常用解析开发包:JAXP、DOM4J

3.DOM解析原理图

4.使用JAXP进行DOM解析

JAXP:(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:

org.w3c.dom:提供DOM方式解析XML的标准接口

org.xml.sax:提供SAX方式解析XML的标准接口

javax.xml:提供了解析XML文档的类

5.JAXP进行DOM解析的实例(增删改查)

book.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架><书 ISBN="a11" 出版社="清华大学出版社"><书名>JavaSE基础</书名><作者>张三</作者><批发价>35.00元</批发价><售价>38.00元</售价></><书 ISBN="b11" 出版社="北京大学出版社"><书名>Android</书名><作者>李四</作者><售价>38.00元</售价></>
</书架>

JaxpDomDemo.java

package cn.lsl.jaxp;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;public class JaxpDomDemo {public static void main(String[] args) throws Exception {//得到解析工厂DocumentBuilderFactoryDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//得到解析器DocumentBuilderDocumentBuilder builder =  factory.newDocumentBuilder();//解析指定的XML文档,得到代表内存DOM树的Document对象Document document = builder.parse("src/book.xml");test8(document);}//1.得到某个具体节点内容:打印第2本书的作者public static void test1(Document document){//根据标签的名称获取所有的作者元素NodeList nodeList = document.getElementsByTagName("作者");//按照索引取第2个作者元素Node node = nodeList.item(1);//打印该元素的文本String text = node.getTextContent();System.out.println(text);}// 2、遍历所有元素节点:打印元素的名称public static void test2(Node node){//判断当前节点是不是一个元素节点if(node.getNodeType() == Node.ELEMENT_NODE){//如果是:打印他的名称
            System.out.println(node.getNodeName());}//查找子节点NodeList nodeList = node.getChildNodes();int len = nodeList.getLength();for (int i = 0; i < len; i++) {Node n = nodeList.item(i);test2(n);}}//3、修改某个元素节点的主体内容:把第一本书的售价改为38.00元public static void test3(Document document) throws Exception{//找到第一本书的售价NodeList nodeList = document.getElementsByTagName("售价");//设置其主体内容Node node = nodeList.item(0);node.setTextContent("38.00元");//把内存中Document树写回xml文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//4.向指定元素节点中增加子元素节点:第一本中增加子元素<内部价>29.00</内部价>public static void test4(Document document) throws Exception{//创建一个新的元素并设置其主体内容Element e = document.createElement("内部价");e.setTextContent("29.00元");//找到第一本书元素Node firstBookNode = document.getElementsByTagName("书").item(0);//把新节点挂接到第一本书上
        firstBookNode.appendChild(e);//把内存中Document树写回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//5.向指定元素节点上增加同级元素节点:在第一本书的售价前面增加批发价public static void test5(Document document) throws Exception{//创建一个新的元素并设置其中的主题内容Element e = document.createElement("批发价");e.setTextContent("35.00元");//找到第一本书的售价Node firstPrice = document.getElementsByTagName("售价").item(0);//在售价的前面加入新建的元素:增加子元素一定要用父元素来增加
        firstPrice.getParentNode().insertBefore(e, firstPrice);//把内存中Document树写回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//6.删除指定元素节点:删除内部价public static void test6(Document document) throws Exception{//找到内部价节点,用父节点删除Node n = document.getElementsByTagName("内部价").item(0);n.getParentNode().removeChild(n);//把内存中Document书写回XML文件中TransformerFactory factory = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}//7、操作XML文件属性:打印第一本书的出版社public static void test7(Document document){//得到第一本书Node n = document.getElementsByTagName("书").item(0);//打印指定属性的取值Element e = (Element)n;System.out.println(e.getAttribute("出版社"));}//8、添加一个出版社属性给第二本书public static void test8(Document document) throws Exception{//得到第二本书Node n = document.getElementsByTagName("书").item(1);//打印指定属性的取值Element e = (Element)n;e.setAttribute("出版社", "北京大学出版社");//把内存中Document树写回XML文件中TransformerFactory factory  = TransformerFactory.newInstance();Transformer ts = factory.newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/book.xml"));}    
}

6.案例(学生成绩的增删改查,采用分层开发)

案例原型

exam.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam><student examid="444" idcard="333"><name>李四</name><location>大连</location><grade>97</grade></student><student examid="666" idcard="555"><name>小舒</name><location>福建</location><grade>90.0</grade></student>
</exam>

实体类:Student.java

package cn.lsl.domain;public class Student {private String idcard;private String examid;private String name;private String location;private Double grade;public String getIdcard() {return idcard;}public void setIdcard(String idcard) {this.idcard = idcard;}public String getExamid() {return examid;}public void setExamid(String examid) {this.examid = examid;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getLocation() {return location;}public void setLocation(String location) {this.location = location;}public Double getGrade() {return grade;}public void setGrade(Double grade) {this.grade = grade;}@Overridepublic String toString() {return "Student [examid=" + examid + ", grade=" + grade + ", idcard="+ idcard + ", location=" + location + ", name=" + name + "]";}
}

工具类:DocumentUtil.java

package cn.lsl.util;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
//操作XML的工具类
//工具类中的异常可以抛也可以处理
public class DocumentUtil {public static Document getDocument() throws Exception{DocumentBuilder builder =  DocumentBuilderFactory.newInstance().newDocumentBuilder();return builder.parse("src/exam.xml");}public static void write2xml(Document document) throws Exception{Transformer ts = TransformerFactory.newInstance().newTransformer();ts.transform(new DOMSource(document), new StreamResult("src/exam.xml"));}
}

DAO层:(StudentDao.java)

package cn.lsl.dao;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import cn.lsl.domain.Student;
import cn.lsl.util.DocumentUtil;public class StudentDao {//添加学生信息到XML中public boolean createStudent(Student s){boolean result = false;try{Document document = DocumentUtil.getDocument();//创建name、location、grade元素并设置内容Element nameE = document.createElement("name");nameE.setTextContent(s.getName());Element locationE = document.createElement("location");locationE.setTextContent(s.getLocation());Element gradeE = document.createElement("grade");gradeE.setTextContent(s.getGrade()+"");//创建student元素,并设置属性Element studentE = document.createElement("student");studentE.setAttribute("idcard", s.getIdcard());studentE.setAttribute("examid", s.getExamid());studentE.appendChild(nameE);studentE.appendChild(locationE);studentE.appendChild(gradeE);//得到exam元素,把student挂接上去Node node = document.getElementsByTagName("exam").item(0);node.appendChild(studentE);//写回XML文件中
            DocumentUtil.write2xml(document);result = true;}catch(Exception e){throw new RuntimeException(e);    //异常转义。异常链
        }return result;}//根据准考证号查询学生信息public Student findStudent(String examid){Student s = null;try{Document document = DocumentUtil.getDocument();//得到所有student元素NodeList nodelist = document.getElementsByTagName("student");//遍历student元素,判断他的examid属性的取值是否与参数匹配for (int i = 0; i < nodelist.getLength(); i++) {Node node = nodelist.item(i);if(node instanceof Element){Element e = (Element)node;if(e.getAttribute("examid").equals(examid)){//如果匹配,说明找到了学生,创建学生对象s = new Student();s.setExamid(examid);s.setIdcard(e.getAttribute("idcard"));s.setName(e.getElementsByTagName("name").item(0).getTextContent());s.setLocation(e.getElementsByTagName("location").item(0).getTextContent());s.setGrade(Double.parseDouble(e.getElementsByTagName("grade").item(0).getTextContent()));}}}}catch(Exception e){throw new RuntimeException(e);}return s;}//根据学生姓名删除学生public boolean deleteStudent(String name){boolean result = false;try{//得到Document对象Document document = DocumentUtil.getDocument();NodeList nodelist = document.getElementsByTagName("name");for(int i=0; i<nodelist.getLength(); i++){Node node = nodelist.item(i);if(node.getTextContent().equals(name)){node.getParentNode().getParentNode().removeChild(node.getParentNode());//写回XML文档
                    DocumentUtil.write2xml(document);result = true;break;}}}catch(Exception e){throw new RuntimeException(e);}return result;}
}

View层(Main.java)

package cn.lsl.view;import java.io.BufferedReader;
import java.io.InputStreamReader;import cn.lsl.dao.StudentDao;
import cn.lsl.domain.Student;public class Main {public static void main(String[] args) {try{StudentDao dao = new StudentDao();System.out.println("a、添加学生\tb、删除学生\tc、查询成绩");System.out.println("请输入操作类型");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String operation = br.readLine();if("a".equals(operation)){//添加操作System.out.println("请输入学生姓名");String name = br.readLine();System.out.println("请输入学生准考证号");String examid = br.readLine();System.out.println("请输入学生身份证号");String idcard = br.readLine();System.out.println("请输入学生所在地");String location = br.readLine();System.out.println("请输入学生成绩");String grade = br.readLine();Student s = new Student();s.setExamid(examid);s.setIdcard(idcard);s.setName(name);s.setLocation(location);s.setGrade(Double.parseDouble(grade));//System.out.println(s);boolean b = dao.createStudent(s);if(b){System.out.println("---添加成功---");}else{System.out.println("对不起!数据有误");}}else if("b".equals(operation)){System.out.println("请输入要删除的学生姓名:");String name = br.readLine();boolean b = dao.deleteStudent(name);if(b){System.out.println("--删除成功--");}else{System.out.println("对不起!删除失败或者学生不存在");}}else if("c".equals(operation)){//查询操作System.out.println("请输入要查询的学生准考证号:");String examid = br.readLine();Student s = dao.findStudent(examid);if(s == null){System.out.println("对不起!您查询的学生不存在");}else{System.out.println(s);}}else{System.out.println("请输入正确的操作类型");}}catch(Exception e){System.out.println("对不起!服务器忙!");}}
}

7.SAX解析原理图

 

8. SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。

9.SAX解析

实例一:

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<书架> <书 出版社="清华大学出版社"> <书名>JavaSE基础</书名>  <作者>张三</作者>  <售价>38.00</售价>  <内部价>19.00</内部价> </>  <> <书名>Android</书名>  <作者>李四</作者>  <售价>28.00</售价> </> 
</书架>

SAXDemo1.java

package cn.lsl.sax;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;//JAXP进行SAX解析
public class SAXDemo1 {public static void main(String[] args) throws Exception {//得到解析工厂SAXParserFactorySAXParserFactory factory = SAXParserFactory.newInstance();//得到解析器SAXParserSAXParser parser = factory.newSAXParser();//得到XML读取器:XMLReaderXMLReader reader = parser.getXMLReader();//注册内容处理器:ContentHandlerreader.setContentHandler(new MyContentHandler());//取出XML文档reader.parse("src/book.xml");}
}class MyContentHandler implements ContentHandler{//解析到文档开始时被调用
    @Overridepublic void startDocument() throws SAXException {System.out.println("解析到了文档的开始");}//解析到了元素开始时被调用:    qName元素名称
    @Overridepublic void startElement(String uri, String localName, String qName,Attributes atts) throws SAXException {System.out.println("解析到了元素的开始:"+qName);}//解析到了文本内容被调用
    @Overridepublic void characters(char[] ch, int start, int length)throws SAXException {System.out.println("文本内容:"+new String(ch,start,length));}//解析到元素结束时被调用
    @Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {System.out.println("解析到了元素的结束:"+qName);}//解析到文档结束时被调用
    @Overridepublic void endDocument() throws SAXException {System.out.println("解析到了文档的结束");}@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stub
        }@Overridepublic void ignorableWhitespace(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stub
        }@Overridepublic void processingInstruction(String target, String data)throws SAXException {// TODO Auto-generated method stub
        }@Overridepublic void setDocumentLocator(Locator locator) {// TODO Auto-generated method stub
        }@Overridepublic void skippedEntity(String name) throws SAXException {// TODO Auto-generated method stub
        }@Overridepublic void startPrefixMapping(String prefix, String uri)throws SAXException {// TODO Auto-generated method stub
        }
}

实例二:

SAXDemo2.java

package cn.lsl.sax;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;//打印第2本书的作者    
public class SAXDemo2 {public static void main(String[] args) throws Exception {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();XMLReader reader = parser.getXMLReader();reader.setContentHandler(new ContentHandler(){    //匿名内部类boolean isAuthor = false;    //是不是作者标签int index = 0;    //作者标签的索引
            @Overridepublic void startElement(String uri, String localName,String qName, Attributes atts) throws SAXException {if("作者".equals(qName)){isAuthor = true;}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if(isAuthor&&index==1){System.out.println(new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if("作者".equals(qName)){index++;}isAuthor = false;}@Overridepublic void endDocument() throws SAXException {// TODO Auto-generated method stub
                }@Overridepublic void endPrefixMapping(String prefix) throws SAXException {// TODO Auto-generated method stub
                }@Overridepublic void ignorableWhitespace(char[] ch, int start, int length)throws SAXException {// TODO Auto-generated method stub
                }@Overridepublic void processingInstruction(String target, String data)throws SAXException {// TODO Auto-generated method stub
                }@Overridepublic void setDocumentLocator(Locator locator) {// TODO Auto-generated method stub
                }@Overridepublic void skippedEntity(String name) throws SAXException {// TODO Auto-generated method stub
                }@Overridepublic void startDocument() throws SAXException {// TODO Auto-generated method stub
                }@Overridepublic void startPrefixMapping(String prefix, String uri)throws SAXException {// TODO Auto-generated method stub
                }});reader.parse("src/book.xml");}
}

实例三:读取XML内容,封装到JavaBean

Book.java

package cn.lsl.domain;public class Book {private String name;private String author;private Double price;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;}@Overridepublic String toString() {return "Book [author=" + author + ", name=" + name + ", price=" + price+ "]";}
}

SAXDemo3.java

package cn.lsl.sax;import java.util.ArrayList;
import java.util.List;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;import cn.lsl.domain.Book;//读取XML内容,封装到JavaBean
public class SAXDemo3 {public static void main(String[] args) throws Exception {SAXParser parser = SAXParserFactory.newInstance().newSAXParser();XMLReader reader =  parser.getXMLReader();final List books = new ArrayList();reader.setContentHandler(new DefaultHandler(){Book book = null;String currentTagName = null;@Overridepublic void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {if("书".equals(qName)){book = new Book();}currentTagName = qName;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if("书名".equals(currentTagName)){book.setName(new String(ch,start,length));}if("作者".equals(currentTagName)){book.setAuthor(new String(ch,start,length));}if("售价".equals(currentTagName)){book.setPrice(Double.parseDouble(new String(ch,start,length)));}}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {if("书".equals(qName)){books.add(book);book = null;}currentTagName = null;}});reader.parse("src/book.xml");for (Object b:books) {System.out.println(b);}}
}

 

 

转载于:https://www.cnblogs.com/EvanLiu/p/3665113.html

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

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

相关文章

VScode 格式化代码快捷键、修改快捷键

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 请看仔细快捷键是&#xff1a; shift alt F // 我是从 eclipse 转的 idea &#xff0c;现在再用 vscode , 一直条件反射的按的 c…

TCP报文格式详解

TCP协议只定义了一种报文格式 建立、拆除连接、传输数据使用同样的报文 TCP报文格式 TCP报文段首部&#xff08;20个字节&#xff09; 源端口和目的端口&#xff1a;各占2个字节&#xff0c;16比特的端口号加上32比特的IP地址&#xff0c;共同构成相当于传输层服务访问点的地址…

Vue 生命周期中 mounted( ) 和 created( ) 的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、什么是生命周期&#xff1f; 用通俗的语言来说&#xff0c;就是Vue中实例或者组件从创建到消灭中间经过的一系列过程。虽然不太严谨…

基于java的数据结构学习——数组实现的栈以及简单应用

栈 Stack 栈是一种线性结构相比数组&#xff0c;栈对应的操作是数组的子集只能从一端添加元素&#xff0c;也只能从一端取出元素这一端称为栈顶栈是一种后进先出的数据结构 栈的应用 无处不在的Undo操作&#xff08;撤销&#xff09;括号匹配&#xff08;编译器&#xff09;程…

2013驾考科目三考试难点解析

原来规定科目三考试上车准备、起步、直线行驶等13个道路驾驶技能项目。123号令实施后&#xff0c;科目三考试分两部分。道路驾驶技能考试项目增加到16项&#xff0c;增加了加减挡位操作、路口左转弯、路口右转弯3个考试项目&#xff0c;驾驶里程也增加。如何顺利通过2013驾考科…

基于java的数据结构学习——数组实现的队列和循环队列及性能对比

队列 Queue 队列也是一种线性结构相比数组&#xff0c;队列对应的操作是数组的子集只能从一端&#xff08;队尾&#xff09;添加元素&#xff0c;只能从另一端&#xff08;队首&#xff09;取出元素队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue<E> voi…

新手如何准确的控制油门

日常练车还不赖&#xff0c;可是一换车就容易加大油门儿&#xff0c;有啥子办法能美好的扼制油呢?和调的坐位有关系吗? 答&#xff1a;油门儿跟刹车被视为交通工具扼制的魂灵。交通工具引擎发动机的油门儿&#xff0c;通常是靠踏板来扼制的&#xff0c;也称加速踏板&#xff…

vue 项目:文件夹 结构 、配置详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 项目配置 首先&#xff0c;在确定好使用的框架和组件库后&#xff0c;先要大致了解它们&#xff0c;做到文档基本熟悉。本次开发使用…

DIV 半透明层、 CSS实现网页 背景半透明

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 DIV半透明实现&#xff0c;使用CSS实现DIV成半透明效果&#xff0c;CSS实现层与背景半透明效果。 一、DIV CSS半透明基础介绍 - …

加速时如何换挡

加速时如何换挡&#xff0c;您知道吗?为了使换挡过程顺利进行&#xff0c;变速器内齿轮平稳啮合&#xff0c;必须掌握好发动机转速&#xff0c;在适当时机推动变速杆操纵齿轮啮合。为此&#xff0c;要通过反复练习&#xff0c;一边踩踏油门踏板&#xff0c;一边听发动机运转声…

vue 项目 引用(外部) js、css

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的工程结构&#xff1a; 1. 引入 css 有 2 种方式&#xff1a; 方式 1 <script type"text/javascript">import .…

自动挡车挡位的基本知识介绍

一般来说&#xff0c;自动档汽车的自动变速器的档位分为P、R、N、D、2 (或S)、L(或1)等。下面分别详细介绍如下&#xff1a; P (Parking) 停车档&#xff0c;或称泊车档&#xff1a; P用作停车之用&#xff0c;它是利用机械装置去锁紧汽车的转动部分&#xff0c;使汽车不能移动…

解决:(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8082 -j DNAT --to-destin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 用 docker 部署一个前端工程&#xff0c;run 后容器有了&#xff0c;却不是运行状态&#xff0c;是创建状态&#xff0c;于是我执行 …

无损压缩——Huffman编码

最近项目中涉及到人脸关键点中神经网络的压缩&#xff0c;采用了性能较好的哈夫曼编码进行。 源码地址&#xff1a;https://github.com/believeszw/HuffmanCompress 1 引言 哈夫曼&#xff08;Huffman&#xff09;编码算法是基于二叉树构建编码压缩结构的&#xff0c;它是数据…

26条安全开车经验 开车20年老司机分享

总有些人&#xff0c;觉得自己开车技术比舒马赫牛叉&#xff0c;市区高速漂移无比潇洒。也总有些人&#xff0c;觉得路是自家的铺的&#xff0c;爱怎么开就怎么开&#xff0c;爱停哪就停哪&#xff0c;哪个不服打开车窗就是一句国骂一个中指。其实他们都没有意识到&#xff0c;…

解决:Request header field Content-Type is not allowed by Access-Control-Allow-Headers

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 前端 vue 工程 post 请求后端接口&#xff0c;报错&#xff1a; Request header field Content-Type is not allowed by Access-Con…

书写README的各种markdown语法

README 该文件用来测试和展示书写README的各种markdown语法。GitHub的markdown语法在标准的markdown语法基础上做了扩充&#xff0c;称之为GitHub Flavored Markdown。简称GFM&#xff0c;GFM在GitHub上有广泛应用&#xff0c;除了README文件外&#xff0c;issues和wiki均支持…

Apache2.4配置ssl

1》验站 如下截图&#xff0c;验站就是在DNS域名商哪里&#xff0c;在对应host下面&#xff0c;添加一个TXT记录类型&#xff0c;主机记录&#xff0c;记录值后&#xff0c;检测即可。   2》SSL证书申请 阿里云&#xff0c;腾讯云有很多免费证书申请&#xff0c;免费的缺点是…

助你解决新手开车四大问题 为您支招

新手开车起步技巧涉及方方面面&#xff0c;对于新手来说&#xff0c;如何首次将车独自开上路且不发生任何意外是众多人热切盼望的理想方式。但是新手上路难免会磕磕碰碰&#xff0c;发生小摩擦都是在所难免的&#xff0c;那么如何在起步阶段就将发生事故的概率降到最低呢?在此…

VUE - get 、post 请求后端接口:get 、post 写法 (Axios 中文说明文档地址)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Axios 中文使用说明文档地址&#xff1a;Axiox 中文说明文档 我只是记录下写法&#xff0c;两种请求都能正常运行&#xff1a; 1. 安装…