sax解析xml文件(三)

【Java编程】SAX XML Parser解析、生成XML文件 1、优缺点 优点: SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询 阅读详情

在实际开发中,我们经常需要将数据库的一条记录,封装成bean,然后存储到集合里面.

那么,我们也可以利sax 将xml文件中的结点封装到bean里,然后存储到集合里.下面以前面两篇中的users.xml为例,总结下

xml文件users.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <users>
  3.     <user id="001">
  4.         <username>james</username>
  5.         <password>javajsp</password>
  6.     </user>
  7.     <user id="002">
  8.         <username>adu</username>
  9.         <password>adu</password>
  10.     </user>
  11.     <user id="003">
  12.         <username>root</username>
  13.         <password>root</password>
  14.     </user><user id="004">
  15.         <username>lishanli</username>
  16.         <password>lishanli</password>
  17.     </user>
  18. </users>

先设计好bean实体,代码如下:

  1. package org.james.pojo;
  2. public class UserInfo {
  3.     private String username;
  4.     private String password;
  5.     private String id;
  6.     public String getUsername() {
  7.         return username;
  8.     }
  9.     public void setUsername(String username) {
  10.         this.username = username;
  11.     }
  12.     public String getPassword() {
  13.         return password;
  14.     }
  15.     public void setPassword(String password) {
  16.         this.password = password;
  17.     }
  18.     public String getId() {
  19.         return id;
  20.     }
  21.     public void setId(String id) {
  22.         this.id = id;
  23.     }
  24. }

创建DefaultHandler,依然,利用sax解析xml和stack结构相似的技巧.代码如下:

  1. package org.james.sax.util;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Stack;
  5. import org.james.pojo.UserInfo;
  6. import org.xml.sax.Attributes;
  7. import org.xml.sax.SAXException;
  8. import org.xml.sax.helpers.DefaultHandler;
  9. public class AllUserHandler extends DefaultHandler {
  10.     private List<UserInfo> list=new ArrayList<UserInfo>();
  11.     private UserInfo uiobj;
  12.     private Stack<String> sta=new Stack<String>();
  13.     @Override
  14.     public void characters(char[] ch, int start, int length)
  15.             throws SAXException {
  16.         if(!sta.empty()){
  17.             String name=sta.peek();
  18.             if("username".equals(name)){
  19.                 uiobj.setUsername(new String(ch,start,length));
  20.             }else if("password".equals(name)){
  21.                 uiobj.setPassword(new String(ch,start,length));
  22.             }
  23.         }
  24.     }
  25.     @Override
  26.     public void endElement(String uri, String localName, String name)
  27.             throws SAXException {
  28.         if("username".equals(name)){
  29.             sta.pop();
  30.         }else if("password".equals(name)){
  31.             sta.pop();
  32.         }else if("user".equals(name)){
  33.             list.add(uiobj);
  34.             uiobj=null;
  35.             sta.pop();
  36.         }
  37.     }
  38.     @Override
  39.     public void startElement(String uri, String localName, String name,
  40.             Attributes attributes) throws SAXException {
  41.         if(attributes!=null){
  42.             String id=attributes.getValue("id");
  43.             if(id!=null){
  44.                 uiobj=new UserInfo();
  45.                 uiobj.setId(id);
  46.             }
  47.         }
  48.         if("user".equals(name)){
  49.             sta.push(name);
  50.         }else if("username".equals(name)){
  51.             sta.push(name);
  52.         }else if("password".equals(name)){
  53.             sta.push(name);
  54.         }
  55.     }
  56.     public List<UserInfo> getList() {
  57.         return list;
  58.     }
  59.     
  60. }

测试类,沿用UserService.稍作修改.如下:

  1. package org.james.sax;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import org.james.pojo.UserInfo;
  9. import org.james.sax.util.AllUserHandler;
  10. import org.james.sax.util.IsExistedUserHandler;
  11. import org.james.sax.util.ValidateLoginHandler;
  12. import org.xml.sax.SAXException;
  13. public class UserService {
  14.     private static InputStream IN =UserService.class.getClassLoader().getResourceAsStream("users.xml");
  15.     private SAXParser saxParser;
  16.     public UserService(){
  17.         try {
  18.             saxParser=SAXParserFactory.newInstance().newSAXParser();
  19.         } catch (ParserConfigurationException e) {
  20.             e.printStackTrace();
  21.         } catch (SAXException e) {
  22.             e.printStackTrace();
  23.         }
  24.     }
  25.     public boolean isExistedUser(String id){
  26.         IsExistedUserHandler ieuh=new IsExistedUserHandler (id);
  27.         try {
  28.             saxParser.parse(IN, ieuh);
  29.         } catch (SAXException e) {
  30.             System.out.println(e.getMessage());
  31.             return true;
  32.         } catch (IOException e) {
  33.             e.printStackTrace();
  34.         }
  35.         return false;
  36.     }
  37.     public boolean validateLogin(String username,String password){
  38.         ValidateLoginHandler vlh=new ValidateLoginHandler(username,password);
  39.         try {
  40.             saxParser.parse(IN, vlh);
  41.         } catch (SAXException e) {
  42.             System.out.println(e.getMessage());
  43.             return true;
  44.         } catch (IOException e) {
  45.             e.printStackTrace();
  46.         }
  47.         return false;
  48.     }
  49.     public List<UserInfo> getAllUsers(){
  50.         AllUserHandler auh=new AllUserHandler();
  51.         try {
  52.             saxParser.parse(IN, auh);
  53.         } catch (SAXException e) {
  54.             System.out.println(e.getMessage());
  55.         } catch (IOException e) {
  56.             e.printStackTrace();
  57.         }
  58.         return auh.getList();
  59.     }
  60.     public static void main(String... args){
  61.         UserService us=new UserService();
  62.         //System.out.println(us.isExistedUser("002"));
  63.         //System.out.println(us.validateLogin("root", "ro"));
  64.         List<UserInfo> list=us.getAllUsers();
  65.         for(UserInfo ui : list){
  66.             System.out.println("id: "+ui.getId());
  67.             System.out.println("username: "+ui.getUsername());
  68.             System.out.println("password: "+ui.getPassword());
  69.             System.out.println("---------------------------");
  70.         }
  71.     }
  72. }

好了,先说到这儿了...呵呵

SAX解析XML文件 SAX解析简介 SAX(Simple API for XML)是一种以事件驱动的XML API,是XML解析的方式之一。DOM解析会将XML全部加载到内存中,再进行解析。SAX与DOM不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点。 SAX解析步骤 SAX解析的核心步骤有如下几步: 得到xml文件对应的资源,可以是xml的输入流,文件和... 阅读详情

相关推荐

Java SAX 解析 XML

与 DOM 建立树形结构的方式不同,SAX 采用事件模型来解析 XML 文档,是解析 XML 文档的一种更快速、更轻量的方法。 利用 SAX 可以对 XML 文档进行有选择的解析和访问,而不必像 DOM 那样加载整个文档,因此它对内存的要求较低。 但 SAX 对 XML 文档的解析为一次性读取,不创建任何文档对象,很难同时访问文档中的多处数据。 在解析xml文件之前,我们要先了解xml文件的

itmyhome的专栏 2203

【Java】解析XML配置文件总结——SAX解析XML(三)

什么是Sax SAX,即Simple API For XML。非W3C官方所提供的标准,是“民间”的事实标准。SAX在概念上与DOM完全不同,SAX提供的访问方式是一种顺序模式(即推模式),这是一种快速读写XML数据的方式。当使用SAX解析器对xml文件进行解析时,会触发一系列的事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数对xml文档的访问。 SAX解析器被称为SAXParser...

菜鸟sdut的博客 731

Android XML解析实战:SAX、DOM与Pull详解

SAX解析的核心在于“事件驱动”(Event-driven)。它不像DOM解析那样一次性将整个XML文档加载到内存中,而是逐行读取XML内容,当解析器遇到特定的结构(如开始标签、结束标签、文本内容等)时,会触发相应的回调事件。这些事件包括::文档开始解析时触发。:文档解析结束时触发。:遇到开始标签时触发。:遇到结束标签时触发。:读取到文本内容时触发。这些事件的处理由开发者自定义的子类来完成。通过重写这些方法,可以实现对XML数据的动态解析与处理。

weixin_35755823的博客 819

Android解析XML文件的三方法之SAX

SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,它不需要解析完整个文档,而是按 照内容顺序 看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法: startDocument:当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作。 st

AlienTech for better life!~ 831

AI与运筹学赋能:混合动力公交调度优化算法实战解析

组合优化是运筹学与计算机科学交叉的核心领域,旨在从海量可行方案中寻找最优解,其原理在于通过定义目标函数与约束条件,将复杂现实问题转化为可计算的数学模型。该技术的核心价值在于解决资源受限下的高效分配问题,广泛应用于物流、交通、生产调度等场景。在智慧交通领域,混合动力公交车辆调度正是一个典型的组合优化问题,涉及车辆、班次、充电桩等多重资源与时空约束。本文聚焦于通过贪婪启发式与模拟退火元启发式算法,求解大规模公交网络下的车辆调度与能耗优化方案,旨在实现总能源成本最小化。其中,模拟退火算法通过引入概率性接受劣解的策

weixin_42497762的博客 406

AAAI2024最佳解读|FontDiffuser One-Shot Font Generation via Denoising Diffusion with Multi-Scal

本文提出了一种名为FontDiffuser的基于扩散的单次字体生成方法,旨在通过去噪扩散模型生成模仿参考图像风格的字体,同时保留源图像的内容。尽管现有的字体生成方法在性能上取得了一定的进展,但在处理复杂字符和大风格变化时仍面临挑战。FontDiffuser通过引入多尺度内容聚合(MCA)模块,有效结合不同尺度的全局和局部内容线索,从而增强复杂字符的笔画保留能力。此外,文章还提出了一种风格对比细化(SCR)模块,用于风格表示学习,利用风格提取器从图像中分离风格,并通过精心设计的风格对比损失来监督扩散模型。

haimianxiaobao11的博客 1190

BetaFlight开源飞控源码分析

BetaFlight是穿越机领域比较成熟的开源飞控,本篇文章主要分析一下源代码以及如何使用这个开源代码

weixin_43811044的博客 1万+

android解析XML文件的三方法之SAX

    采用DOM方法读取XML文档,由于使用DOM方法需要将整个XML文档加载内存中,对系统资源占用比较多,这对内存比较紧张的Android系统来说,使用 DOM方法读取XML文档会有很大的限制。 使用SAX方法读取XML,对内存资源的占用的比较少,因此在嵌入式设备中极力推荐使用,Android也不例外,本篇幅详细说明Android中如何使用SAX读取XML文档。     基于事件的处理模式主...

人生就是一种修行 167

别再只用三次多项式了!用MATLAB手把手教你搞定七次多项式轨迹规划(附完整代码)

本文详细介绍了七次多项式在轨迹规划中的优势与应用,通过MATLAB实现从理论推导到实际代码的全过程。相比传统的三次多项式,七次多项式能精确控制位置、速度、加速度和加加速度,实现更平滑的运动控制,特别适用于工业机器人和数控机床等高精度场景。文章包含完整的MATLAB代码示例和优化技巧,帮助工程师快速掌握这一高级轨迹规划方法。

weixin_30872337的博客 297

告别代码移植烦恼:STM32CubeMX 6.4.0 + STM32F407ZGT6 + YT8512C PHY芯片的LWIP网络配置全攻略

本文详细介绍了如何使用STM32CubeMX 6.4.0配置STM32F407ZGT6与YT8512C PHY芯片的LWIP网络适配,包括硬件特性解析、STM32CubeMX基础配置、专用驱动适配和LWIP协议栈定制化配置,帮助开发者解决PHY芯片差异导致的网络问题。

weixin_28718793的博客 290

对XML文件的重新认识,说说XML文件的二三事(三):XML两类解析模式(1)-SAX解析XML

XML的解析方式常见的有两种,一种是以事件为驱动的XML解析,比如SAX。另外一种是类似于树形属性结构的数据,比如DOM类以及在此基础上延伸升级的JDOM以及DOM4J。这两种解析XML的方式完全不同,是两种不同的机制,其主要对比可以见下表: XML解析方法 优点 缺点 SAX 1.    效率和性能较好,不需要读入全部数据。 2

郭浩(C/C++) 553

AI智能体在化学中的伦理问题:7个案例,架构师如何应对?

AI在化学中的应用早已不是新鲜事:药物发现中用AI预测分子活性(比如AlphaFold预测蛋白质结构)、化工生产中用AI优化合成路线(降低成本30%+)、材料研发中用AI设计新型电池材料(缩短研发周期5年)……但随着AI从“辅助工具”升级为“自主决策智能体”(比如能自动调整反应条件的“化学机器人”),伦理风险开始从“潜在隐患”变成“真实事故”。AI在化学中会踩哪些伦理“坑”?(用案例具象化)这些“坑”的底层逻辑是什么?(从技术到价值观的链条)架构师能做什么?

AI 算法实战派 1362

XML解析的三种方式(dom,sax,dom4j)

1.Dom解析: 要解析的xml文件内容: class> stu id="1"> name>小灰灰name> age>23age> insto>好学生insto> stu> stu id="2" sex="女"> name>小红name> age>20age> insto

ZhangYaohui专栏 1382

C语言关键字static的绝妙用途

为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字,在局部变量中,变量仅限于局部可见,在全局区中,static变量或函数仅限于本文件可见,当然还有一个重要的特性被忽略了。。。。       就是static修饰的局部变量 它的数值 是上一次函数调用结

Bruce.yang的嵌入式之旅 5378

Python 爬虫实战:爬取豆瓣读书评论并分析

摘要:本文以豆瓣读书《活着》评论数据为例,详细讲解Python爬虫开发与文本分析全流程。首先通过requests库爬取评论数据,解决分页、反爬等问题;然后利用BeautifulSoup解析页面提取评论内容、评分等核心信息;最后结合jieba进行关键词提取、snownlp完成情感分析,并通过可视化展示结果。分析显示该书评分以5星为主(占比70%),正面评论达82%,核心关键词为"活着""余华""生命"。全文包含完整代码与详细解析,帮助读者掌握非结构化

2503_91057718的博客 1497

XML解析(一),SAX解析XML

一、概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOC解析,PULL解析(Android特有),SAX与DOC不同的是它边扫描边解析,自顶向下依次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点,对于Android等CPU资源宝贵的移动平台来说是一个巨大的优势。 SAX的优点:解析速

宿罪的博客 3万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python之SAX解析XML

SAX 是一种基于事件驱动的API。 利用 SAX 解析 XML 文档牵涉到两个部分: 解析器和事件处理器。 解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。 而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。 1、对大型文件进行处理; 2、只需要文件的部分内容,或者只需从文件中得到特定信息。 3、想建立自己的对象模型的时候。 在 Python 中...

起风了 3832

WINCC7.3破解文件

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java使用SAX解析器解析XML文件

SAX,也称为Simple API for XML,是jdk自带的 用于解析 XML 文档 API。它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小,所以 SAX 具有高效的内存管理。 三、XmlRow类 四、SAXHandler类 五、测试 输出: 参考:Parsing an XML File Using SAX ParserParsing an XML File Using StAXexcel-xml-

西凉的悲伤博客 4283

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android中使用SAX方式解析XML文件

在Android中解析XML文主要有三种方式,分别为Simple API for XML(SAX)、Document Object Model(DOM)和Android附带的pull解析器。在本篇文章中主要采用例子说明使用SAX方式解析XML文件。          SAX是一

Android-Idea 5541

Android之SAX解析XML

首先我们来了解一下SAX解析器的基本知识: SAX(Simple API for XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相

bear_huangzhen的专栏 1万+

用SAX解析xml文件的例子

 1. Xml技术简介Xml文件有两种约束类型,包括文档类型定义(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的标准里。Xml 模式被包含在W3C的标准中。在xml 数据和xml 模式两者之间有很多的区别。A. xml模式支持的数据类型比xml DTD多;B. xml模式在无序的情况下使用起来比xml DTD更方便;C. xml模式支持名字空间,可以在不同的文件中定义相同

上海夜未眠 1万+

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

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

午后红茶 1157

SAX和DOC解析XML文件

前言:在进入正题之前,我觉得很有必要让大家回顾一下最常用的XML文件解析的两种方式:SAX解析 和 DOC解析 1. SAX解析 (Simple API for XML) 定义:SAX是Simple API for XML的缩写,它是事件驱动的,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。 优点:1....

欧阳俞峰的个人博客 1050
上一篇: sax解析xml文件(一)
下一篇: dom4j学习笔记(一)
JavaChenYang
博客等级 码龄20年 35粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值