Javaweb-xml编程-sax解析与实例

从NASA DataPort下载到PyTorch Dataset:手把手处理USGS光谱库的AVIRIS数据 本文详细介绍了如何从NASA DataPort下载USGS光谱库的AVIRIS高光谱数据,并将其转化为PyTorch Dataset对象。内容涵盖数据获取、预处理、辐射定标及高效数据加载技巧,特别针对AVIRIS数据的水吸收波段剔除和波段分组标准化进行了重点讲解,为环境监测、地质勘探等领域的研究者提供实用指南。 阅读详情

sax解析

使用sax的原因

  • 在使用DOM解析XML文档时,需要解读整个XML文档,在内存中的架构代表整个DOM树的document对象,从而再对XML进行操作;
  • 在以上的情况下,如果XML文档特别大,就会大量消耗计算机的内存,并且容易导致内存溢出;
  • SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。

sax解析原理

sax采用事件处理的方式解析XML文件,使用sax解析文件,涉及两个部分:解析器和事件处理器

  • 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
  • 解析器采用SAX方式在解析某个XML文档时,当它解析到XML文档的一个组成部分,就会去调用事件处理器的一个方法,将当前解析到的XML文件内容作为方法的参数传给事件处理器。
  • 事件处理器有程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到SAX解析器解析到的数据,从而决定如何对数据进行处理。

实例说明

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架>
<书架>
   <书>
         <书名 name="xxx">数据结构</书名>
         <作者>严蔚敏</作者>
         <售价>39.0元</售价>
   </书>
   <书>
         <书名>大话设计模式</书名>
         <作者>程杰</作者>
         <售价>45.0</售价>
   </书>
</书架>

sax解析xml文档

代码①

package sax;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
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;

public class Demo1 {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, Exception {
        //1.创建解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();

        //2.得到解析器
        SAXParser sp = factory.newSAXParser();

        //3.得到读取器
         XMLReader reader = sp.getXMLReader();

        //4.设置内容处理器
        reader.setContentHandler(new ListHandler());

        //5.读取xml文档内容
         reader.parse("src/MyXml.xml");

    }
}
//处理器1:得到xml文档所有内容
class ListHandler implements ContentHandler{

    @Override
    public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("<"+ name +">");

        //获取属性
        for(int i = 0;i<atts.getLength();i++){
            String attName = atts.getQName(i);
            String attValue = atts.getValue(i);
            System.out.println(attName +"="+ attValue);
        }
    }

    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("</"+name+">");
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub
        System.out.println(new String(ch,start,length));
    }
    @Override
    public void setDocumentLocator(Locator locator) {
        // TODO Auto-generated method stub

    }

    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void startPrefixMapping(String prefix, String uri) throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void endPrefixMapping(String prefix) throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void processingInstruction(String target, String data) throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void skippedEntity(String name) throws SAXException {
        // TODO Auto-generated method stub

    }

}
说明
  • 这是可以实现获取所有标签值的处理器1;
  • 处理器1的编写部分其实非常简单,只要实现ContentHandler,Ctrl+1,在我们需要用到的方法里填写需要的内容即可;
  • sax解析的五大步骤就是如上所示不变,处理器要编写我们需要的处理器内容。下面是就获取指定标签值编写处理器

代码②

package sax;

import javax.xml.parsers.ParserConfigurationException;
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;

public class Demo2 {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, Exception {
        //1.创建解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();

        //2.得到解析器
        SAXParser sp = factory.newSAXParser();

        //3.得到读取器
         XMLReader reader = sp.getXMLReader();

        //4.设置内容处理器
        reader.setContentHandler(new TagValueHandler());

        //5.读取xml文档内容
         reader.parse("src/MyXml.xml");

    }
}
class TagValueHandler extends DefaultHandler{

    private String currentTag;//记住当前解析到的是什么标签
    private int needNumber = 2;//表示想获取第二个作者标签的值
    private int currentNumber;//当前解析到的是第几个

    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        currentTag = name;
        if(currentTag.equals("作者")){
            currentNumber++;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {

        if("作者".equals(currentTag)&&currentNumber==needNumber){
            System.out.println(new String(ch,start,length));
        }
    }

    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        currentTag = null;
}

}
说明
  • characters()方法用来处理内容
  • startElement()获取指定标签的值;
  • endElement()结束获取

代码③
最常用的处理器内容编写

package sax;

import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
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;

public class Demo3 {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws ParserConfigurationException, SAXException, Exception {
        //1.创建解析工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();

        //2.得到解析器
        SAXParser sp = factory.newSAXParser();

        //3.得到读取器
         XMLReader reader = sp.getXMLReader();

        //4.设置内容处理器
        BeanListHandler handler = new BeanListHandler();
        reader.setContentHandler(handler);

        //5.读取xml文档内容
         reader.parse("src/MyXml.xml");
         List<Book> list = handler.getBooks();//打断点不能有警告,需压制警告
         System.out.println(list);

    }
}
//把xml文档中的每一本书封装到一个book对象,并把多个book对象放在一个list集合中返回
class BeanListHandler extends DefaultHandler{

    private List list = new ArrayList();
    private String currentTag;
    private Book book;

    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        currentTag = name;
        if("书".equals(currentTag)){
            book = new Book();
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if("书名".equals(currentTag)){
            String name = new String(ch,start,length);
            book.setName(name);
        }
        if("作者".equals(currentTag)){
            String author = new String(ch,start,length);
            book.setAuthor(author);
        }
        if("售价".equals(currentTag)){
            String price = new String(ch,start,length);
            book.setPrice(price);
        }       
    }

    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {
        if(name.equals("书")){
            list.add(book);
            book = null;
        }
        currentTag = null;//不加这句话会出现异常,使用断点异常跟踪异常根由
    }
    public List getBooks() {
        return list;
    }

}

备注:传智播客视频学习笔记

揭秘AI人工智能中Stable Diffusion的模型微调技巧 Stable Diffusion作为一种强大的文本到图像生成模型,在艺术创作、设计、娱乐等多个领域展现出了巨大的应用潜力。然而,其默认的模型输出可能无法满足特定用户或特定场景的个性化需求。本文章的目的在于深入揭秘Stable Diffusion的模型微调技巧,让读者能够根据自己的需求对模型进行定制化调整,生成符合特定风格、主题或要求的图像。范围涵盖了从基础概念到实际操作,从理论原理到项目实战的全方位内容,旨在为读者提供一个系统且深入的学习指南。 阅读详情

相关推荐

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

Spring底层使用SAX解析XML配置文件

最近在研究Spring源代码,在梳理spring-beans时故意只保留org.springframework.beans.factory.xml包下的xsd的3.1版本,然后在看Reference时,上面有一个简单的XML配置文件,如下   &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.sp...

Stay Hungry, Stay Foolish 838

群晖Git Server权限配置全攻略:如何让普通用户(非admin)也能安全提交代码?

本文详细解析了群晖Git Server权限配置方案,特别针对普通用户(非admin)安全提交代码的需求。通过SSH服务配置、精细化用户权限管理及仓库创建自动化脚本,实现在DS218+等群晖NAS设备上的高效代码协作,同时确保系统安全。

weixin_42528780的博客 464

[月痕]利用sax解析xml模拟spring的getbean功能

1.创建pojo类 /** * */ package testspring.bean; /** * @author 无痕菌 * */ public class Student { private int id = 1; private String name = "张三"; private String clazz = "大四一班"; /** * @return id */ public int getId() { ...

u010050660的博客 186

Go语言集成Ollama本地大模型:gollama库实战指南

在当今的AI应用开发中,大型语言模型(LLM)的集成已成为关键技术。其核心原理是通过API调用,将自然语言处理能力嵌入到各类应用中。从技术价值看,本地化部署的LLM解决了数据隐私、网络延迟和持续成本三大痛点,尤其适合处理敏感数据或对实时性要求高的场景。在工程实践中,开发者常使用专门的客户端库来简化与模型服务的交互,例如通过封装REST API、提供类型安全接口和流式处理支持,从而提升开发效率和代码健壮性。具体到Go语言生态,结合Ollama这一流行的本地大模型运行工具,可以实现完全离线、低延迟的AI功能集成

weixin_28728443的博客 605

【OpenClaw从入门到精通】第03篇:吃透Gateway/Skills/ClawHub核心概念(2026实测+避坑)

本文针对OpenClaw新手易混淆的核心概念痛点,以通俗类比+实操演示拆解OpenClaw核心、Gateway、Skills、ClawHub四大组件。通过“数字员工团队”类比明确各组件定位:OpenClaw核心是“老板”(调度中心)、Gateway是“前台+后勤”(后台进程)、Skills是“专业员工”(功能插件)、ClawHub是“人才市场”(技能商店)。补充版本更名史、技能加载优先级、ClawHub与GitHub区别等关键细节,结合“AI融资新闻查询并邮件推送”虚拟案例演示组件协同流程,梳理5个高频认知

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 5045

dbf解析_DOM解析以及SAX解析流程

1、什么是DOM?DOM:Document Object Model,文档对象模型,DOM解析形成了树结构,有助于更好的理解、且代码容易编写。解析过程中,树结构保存在内存中,方便修改。2、DOM解析XML的步骤?1、创建一个DocumentBuilderFactory的对象2、创建一个DocumentBuilder对象3、通过DocumentBuilder的parse(...)方法得到Docume...

weixin_31764905的博客 218

23、工业物流中的多智能体路径规划与碰撞处理策略

本文探讨了工业4.0背景下工业物流中的多智能体路径规划(MAPF)与碰撞处理策略。分析了自动导引车(AGV)等移动资源的应用现状,综述了主流路径规划算法如A*、D*Lite、M*等,以及集中式与分布式碰撞检测方法。重点比较了五种碰撞避免策略:路径交叉、优先级、起始时间调整、无交叉路径和速度调整,提出了基于环境条件的策略选择流程,并通过流程图展示了评估、组合、测试与优化的全过程。文章强调应根据订单不确定性、时间约束、优先级和生产组织等因素综合选择或组合策略,以提升物流效率与系统可靠性。

mac99的博客 125

Spring中运用 SAX的 EntityResolver

目录 1、EntityResolver 介绍 XSD DTD 2、Spring源码中类图 DTD方式 XSD 方式 1、EntityResolver 介绍 官网解释:如果SAX应用程序需要实现自定义处理外部实体,则必须实现此接口并使用 setEntityResolver 方法 向 SAX 驱动器注册一个实例。 对于 XML 文档的解析,SAX首先读取文档声明,根据文档声明去找 D...

ruanhao1203的专栏 802

【AI大模型应用开发】【LangChain系列】实战案例6:利用大模型进行文本总结的方法探索,文本Token超限怎么办?

假设有一组文档(PDF、Notion页面、客户问题等),你想要总结内容。可以利用大模型来帮你。今天来系统看下利用大模型来对文本进行总结的方法,以LangChain的使用为例。

同学小张的博客 3749

Aurix TC3xx系列MCU DMA模块配置方法(二)

本文主要基于英飞凌Aurix TC3xx系列MCU,通过EB tresos配置工具,介绍DMA驱动模块的配置方法。

m0_38045338的博客 2850

【JavaWeb】xml文件_SAX解析(xml文件的解析)

SAX解析 1.编程理念:基于事件编程的原理 2.(1)SAX解析的特点:读取一点,处理一点,解析一点    (2)DOM解析的特点:将整个xml文件加载完毕之后,才开始进行解析(一次性解析)     DOM解析的弊端:使用DOM解析的xml文件内容不能太大,否则会造成内存溢出 3.SAX解析的优点:占用内存小,从占用内从角度考虑SAX解析优于DOM解析 4.SAX解析图解:

午后红茶 1157

YOLOv11改进策略【SPPF】| AIFI : 基于Transformer的尺度内特征交互,在降低计算成本的同时提高模型的性能

本文记录的是基于AIFI模块的YOLOv11目标检测改进方法研究。AIFI是RT-DETR中高效混合编码器的一部分,利用其改进YOLOv11模型,

Limiiiing的博客 2240

javaWeb学习之——XML

javaWeb学习之——XML 学习了java有一段时间了,学的时候觉得弄懂就可以,没每天去总结和写日志。现在感觉以前的想法是错的,现在我要每天都写 日记,把每天的东西总结记下来,以便以后复习,第一次写日志,感觉好烂,表达得也不清楚,今后要更加努力才行。      真蛋疼,刚开通还不能写博客    XML简介 XML是指可扩展的标记语言(eX

枫成的专栏 509

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JavaWeb1——XML 编程

文章目录1.XML 基本概念1.1 性质1.2 与 HTML 的区别1.3 作用 1.XML 基本概念 1.1 性质 XML 即可拓展的标记语言。 可以定义语义标记,是元标记语言。 本质上 XML 文件是一个纯文本文件。 1.2 与 HTML 的区别 HTML 只能使用规定的标记。 XML 用户可以定义自己需要的标记。 1.3 作用 XML 可用于存储数据 - 通过 XML ,纯文本文件可用于储存数据。 XML 可用于交换数据 - 通过使用 XML ,可以在互不兼容的系统间交换数据。 -

NoBug 1693

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JavaWeb - XML解析 - SAX

sax解析2.xml W_Jp 271953489@qq.com W_Cc 109604484@qq.com C_Jm 879451036@qq.com

W_Jp - 编程爱好者 701

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

XML学习之SAX解析XML文件

XML学习之SAX解析XML文件 一、SAX解析方式概述 1、Sax解析允许每读取一行文本就解析一行文本的方式对XML文件进行解析。不必等到读取完文件后才开始解析。提高了解析速度。 2、sax采用事件处理方式解析XML文件,利用SAX解析XML文档,涉及两个问他:解析器和事件处理器。   (1)、解析器:解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个X

yanyu110991的专栏 681

javaWEb-day01(XML编程)

XML编程就是:写java程序操作XML文档。

程序员 474

sax解析xml

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准。SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强。使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器。SAX采用基于事件驱动的处理方式,它

远成伟业 395

javaWeb-day02(用Jaxp做sax解析)

Dom和Sax的区别: 在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。 SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

程序员 531

javaWeb(一)XML简介、Sax解析xml、Xpath解析xml

1、XML简介: eXtendsible Markup Language 可扩展的标记语言 可以用来保存数据 可以用来做配置文件 数据传输载体 2、Sax解析xml: 所有的解析API都在dom4j这个包中 相关API文档:dom4j API 用于解析XML的java库 解析XML有很多方法,其中最主要的有两种: DOM SAX 具体介绍和区别如下: 解析的步骤: 加载jar包...

PizAn的博客 376

JavaWeb开发(六)XML介绍

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。一个元素可以包含:(1)其他元素(2)文本(3)属性XML元素具有属性,类似HTML。属性(Attribute)提供有关元素的额外信息。当我们将数据存储在xm1文件之后,我们希望通过程序去读取xm1的内容,通过java基础的I0也是可以读取的,但是十分的麻烦。因此出现了一些解析的方式。常见的有:DOM解析,SAX解析。由于目前xml很少作为传输数据的方式,所以解析相关的方法用的也很少,作为了解内容。

qq_36158551的博客 1067

java web 解析xml_JavaWeb学习日记----SAX解析XML

1.SAX解析XML文档的方式:与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。优点是可以很方便实现增删改操作。缺点是,如果文件过大,会造成内存溢出。而SAX方式解析XML是采用事件驱动,边读便解析:从上到下,一行一行的解析,解析到某一个对象时,返回对象名称。优点是不会造成内存溢出,可以很方便实现查询操作,缺点是不能实现增...

weixin_39572442的博客 116

【JavaWeb】XML的理解与Dom4j解析技术的使用

本文介绍了xml的用处,并对语法和细节进行了讲解。同时,使用Dom4j解析技术,演示了如何使用dom4j读取xml文件获取Document对象。

黄小黄的博客 733

JavaWeb学习日记----SAX解析XML

1.SAX解析XML文档的方式:   与DOM方式解析不同,DOM方式解析是根据XML的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。优点是可以很方便实现增删改操作。缺点是,如果文件过大,会造成内存溢出。而SAX方式解析XML是采用事件驱动,边读便解析:从上到下,一行一行的解析,解析到某一个对象时,返回对象名称。优点是不会造成内存溢出,可以很方便实现查询操作...

didaolian0825的博客 150

使用SAX读取XML文件

我们在学习JavaWEB基础时,老方有讲解使用JavaSE解析XML文件。我们在学习JavaEE时一般都使用dom4j解析XML文件。在Android中解析XML与JavaSE和JavaEE都差不多,我们也可以在Andorid中使用dom4j,但这会占用系统的资源。  Andorid中解析XML有三种技术SAX、DOM和pull,重点是Sax和pull。尤其是pull,Android推荐使用,A

cactusz的博客 421
上一篇: Javaweb-xml编程-考生成绩管理系统(2)
下一篇: Javaweb-xml编程-Dom4j解析xml文档
spring_willow
博客等级 码龄10年 163粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值