XML解析SAX

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

1. Sax概述

SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentHandler中,下面是其主要方法:
startDocument():当遇到文档的时候就触发这个事件 调用这个方法 可以在其中做些预处理工作,如:申请对象资源
endDocument():当结束文档的时候就触发这个事件 调用这个方法 可以在其中做些善后工作,如:释放申请的对象资源
startElement(String namespaceURI, String localName, String qName, Attributes atts):当遇开始标签的时候就会触发这个方法。
endElement(String uri, String localName, String name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。
charachers(char [] ch, int start, int length):当遇到xml内容时触发这个方法,用new String(ch,start,length)可以接受内容。 

Sax方式创建XML,应用了标准xml构造器 javax.xml.transform.sax.TransformerHandler 事件来创建 XML 文档,需要导入以下内容

javax.xml.transform

javax.xml.transform.sax.SAXTransformerFactory;
javax.xml.transform.sax.TransformerHandler;
javax.xml.transform.Transformer;
javax.xml.transform.TransformerConfigurationException;
javax.xml.transform.TransformerFactoryConfigurationError;
javax.xml.transform.OutputKeys;
javax.xml.transform.stream.StreamResult;
javax.xml.transform.sax.SAXTransformerFactory;

javax.xml.parsers

javax.xml.parsers.SAXParser;

javax.xml.parsers.SAXParserFactory;

javax.xml.parsers.FactoryConfigurationError;

javax.xml.parsers.ParserConfigurationException;

org.xml.sax

org.xml.sax.Attributes;
org.xml.sax.SAXException;
org.xml.sax.helpers.AttributesImpl;
org.xml.sax.helpers.DefaultHandler;

sdk源码查看路径(google code)


Sax 创建和解析 XML 的效果图:




2、Sax 创建 XML

首先,SAXTransformerFactory.newInstance() 创建一个工厂实例 factory

接着,factory.newTransformerHandler() 获取 TransformerHandler 的 handler 对象

然后,通过 handler 事件创建handler.getTransformer()、 handler.setResult(result),以及 startDocument()、startElement、characters、endElement、endDocument()等

Code

[java]  view plain copy print ?
  1. /** Sax方式,创建 XML  */  
  2. public String saxCreateXML(){  
  3.     StringWriter xmlWriter = new StringWriter();  
  4.   
  5.     Person []persons = new Person[3];       // 创建节点Person对象  
  6.     persons[0] = new Person(1, "sunboy_2050", "http://blog.youkuaiyun.com/sunboy_2050");  
  7.     persons[1] = new Person(2, "baidu", "http://www.baidu.com");  
  8.     persons[2] = new Person(3, "google", "http://www.google.com");  
  9.       
  10.     try {  
  11.         SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();  
  12.         TransformerHandler handler = factory.newTransformerHandler();  
  13.           
  14.         Transformer transformer = handler.getTransformer();     // 设置xml属性  
  15.         transformer.setOutputProperty(OutputKeys.INDENT, "yes");  
  16.         transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");  
  17.         transformer.setOutputProperty(OutputKeys.VERSION, "1.0");  
  18.           
  19.         StreamResult result = new StreamResult(xmlWriter);      // 保存创建的xml  
  20.         handler.setResult(result);  
  21.           
  22.         handler.startDocument();  
  23.         AttributesImpl attr = new AttributesImpl();  
  24.           
  25.         attr.clear();  
  26.         attr.addAttribute("", "", "author", "", "homer");  
  27.         attr.addAttribute("", "", "date", "", "2012-04-27");  
  28.         handler.startElement("", "", "root", attr);  
  29.           
  30.         int personsLen = persons.length;  
  31.         for(int i=0; i<personsLen; i++){  
  32.             attr.clear();  
  33.             handler.startElement("", "", "person", attr);  
  34.               
  35.             attr.clear();  
  36.             handler.startElement("", "", "id", attr);  
  37.             String id = persons[i].getId() + "";  
  38.             handler.characters(id.toCharArray(), 0, id.length());  
  39.             handler.endElement("", "", "id");  
  40.   
  41.             attr.clear();  
  42.             handler.startElement("", "", "name", attr);  
  43.             String name = persons[i].getName();  
  44.             handler.characters(name.toCharArray(), 0, name.length());  
  45.             handler.endElement("", "", "name");  
  46.   
  47.             attr.clear();  
  48.             handler.startElement("", "", "blog", attr);  
  49.             String blog = persons[i].getBlog();  
  50.             handler.characters(blog.toCharArray(), 0, blog.length());  
  51.             handler.endElement("", "", "blog");  
  52.               
  53.             handler.endElement("", "", "person");  
  54.         }  
  55.           
  56.         handler.endElement("", "", "root");  
  57.         handler.endDocument();  
  58.           
  59.     } catch (TransformerFactoryConfigurationError e) {      // SAXTransformerFactory.newInstance  
  60.         e.printStackTrace();  
  61.     } catch (TransformerConfigurationException e) {         // factory.newTransformerHandler  
  62.         e.printStackTrace();  
  63.     } catch (IllegalArgumentException e) {      // transformer.setOutputProperty  
  64.         e.printStackTrace();  
  65.     } catch (SAXException e) {      // handler.startDocument  
  66.         e.printStackTrace();  
  67.     } catch (Exception e) {  
  68.         e.printStackTrace();  
  69.     }  
  70.       
  71.     savedXML(fileName, xmlWriter.toString());  
  72.     return xmlWriter.toString();  
  73. }  

运行结果:





3、Sax解析XML

Code

[java]  view plain copy print ?
  1.     /** Sax方式,解析 XML  */  
  2.     public String saxResolveXML(){  
  3.         StringWriter xmlWriter = new StringWriter();  
  4.   
  5.         InputStream is = readXML(fileName);  
  6.         try {  
  7.             SAXParserFactory factory = SAXParserFactory.newInstance();  
  8.             SAXParser saxParser = factory.newSAXParser();  
  9.               
  10.             PersonHandler handler = new PersonHandler();    // person处理Handler  
  11.             saxParser.parse(is, handler);                   // handler解析xml  
  12.               
  13.             // 获取解析的xml  
  14.             String xmlHeader = handler.getXMLHeader();  
  15.             xmlWriter.append(xmlHeader);  
  16.               
  17.             List<Person> personsList = handler.getPersons();  
  18.             int personsLen = personsList.size();  
  19.             for(int i=0; i<personsLen; i++){  
  20.                 xmlWriter.append(personsList.get(i).toString()).append("\n");  
  21.             }  
  22.               
  23.         } catch (FactoryConfigurationError e) {         // SAXParserFactory.newInstance  
  24.             e.printStackTrace();  
  25.         } catch (ParserConfigurationException e) {      // factory.newSAXParser  
  26.             e.printStackTrace();  
  27.         } catch (SAXException e) {          // factory.newSAXParser  
  28.             e.printStackTrace();  
  29.         } catch (IllegalArgumentException e) {      // saxParser.parse  
  30.             e.printStackTrace();  
  31.         } catch (IOException e) {           // saxParser.parse  
  32.             e.printStackTrace();  
  33.         } catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.           
  37.         return xmlWriter.toString();  
  38.     }  
  39.       
  40.     /** Handler处理类 */  
  41.     private final class PersonHandler extends DefaultHandler{  
  42.         private List<Person> personsList = null;  // 保存person  
  43.         private Person person = null;  
  44.         private StringBuffer xmlHeader;             // 保存xml头部信息  
  45.         private String tag = null;          // xml Element  
  46.           
  47.         /** 返回解析的xml头部信息 */  
  48.         public String getXMLHeader(){  
  49.             return xmlHeader.toString();  
  50.         }  
  51.           
  52.         /** 返回解析的Person实例数组 */  
  53.         public List<Person> getPersons(){  
  54.             return personsList;  
  55.         }  
  56.           
  57.         @Override  
  58.         public void startDocument() throws SAXException{  
  59.             super.startDocument();  
  60.             personsList = new ArrayList<Person>();  
  61.             xmlHeader = new StringBuffer();  
  62.         }  
  63.           
  64.         @Override  
  65.         public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{  
  66.             super.startElement(uri, localName, qName, attributes);  
  67.             if("root".equals(localName)) {  
  68.                 String attrAuthor = attributes.getValue(0);  
  69.                 String attrDate = attributes.getValue(1);  
  70.                 xmlHeader.append("root").append("\t\t");  
  71.                 xmlHeader.append(attrAuthor).append("\t");  
  72.                 xmlHeader.append(attrDate).append("\n");  
  73.             } else if("person".equals(localName)) {  
  74.                 person = new Person();  
  75.             }   
  76.             tag = localName;  
  77.         }  
  78.           
  79.         @Override  
  80.         public void characters(char[] ch, int start, int length) throws SAXException {  
  81.             super.characters(ch, start, length);  
  82.             if (null != tag) {  
  83.                 String value = new String(ch, start, length);  
  84.                 System.out.println("value = " + value);  
  85.                 if ("id".equals(tag)) {  
  86.                     person.setId(new Integer(value));  
  87.                 } else if ("name".equals(tag)) {  
  88.                     person.setName(value);  
  89.                 } else if ("blog".equals(tag)) {  
  90.                     person.setBlog(value);  
  91.                 }  
  92.             }  
  93.         }  
  94.           
  95.         @Override  
  96.         public void endElement(String uri, String localName, String qName) throws SAXException {  
  97.             if("person".equals(qName)) {  
  98.                 personsList.add(person);  
  99.                 person = null;  
  100.             }  
  101.             tag = null;  
  102.             super.endElement(uri, localName, qName);  
  103.         }  
  104.           
  105.         @Override  
  106.         public void endDocument() throws SAXException{  
  107. //          personsList = null;  
  108.             super.endDocument();  
  109.         }  
  110.     }  

运行结果:





4、Person类

请参见前面博客 Android 创建与解析XML(二)—— Dom方式 【4、Person类】



代码下载




参考推荐:

javax.xml.transform.sax

javax.xml.parsers

org.xml.sax

TransformerHandler


sax创建xml

Android 解析XML 之SAX




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

相关推荐

DP3(3D Diffusion Policy)算法详解:从点云感知到扩散动作生成

DP3 的全称是:DP3 = 3D Diffusion Policy\boxed{\text{DP3 = 3D Diffusion Policy}}DP3 = 3D Diffusion Policy​对应论文题目是:3D Diffusion Policy: Generalizable Visuomotor Policy Learning via Simple 3D Representations该工作发表于 Robotics: Science and Systems(RSS)2024。DP3 是一种面向机器

u013250861的博客 347

java拼接xml报文框架_XML报文拼接 乱码 - osc_n41kxg36的个人空间 - OSCHINA - 中文开源技术交流社区...

/*Element root = doc.getRootElement();Element ACCOUNTLISTElement = new Element("ACCOUNTLIST");Element ACCOUNTElement = new Element("ACCOUNT");String mobile = autoRegistVo.getMOBILE();Element ACCOUNTNA...

weixin_39576104的博客 203

Android开发必备:TBS腾讯浏览服务静态集成完整指南(附Demo下载)

本文详细解析了Android开发中TBS腾讯浏览服务的静态集成方案,通过对比动态集成,深入剖析了其核心原理与适用场景。文章提供了从环境准备、资源获取、项目配置到代码初始化的完整指南,并重点介绍了WebView与文件预览等高级特性的实战应用。针对集成过程中的常见问题,提供了详尽的排查清单与性能调优建议,旨在帮助开发者构建极致稳定、不依赖网络的WebView与文件预览功能。文末附有经过验证的Demo项目可供下载参考。

earth的博客 366

Android 创建与解析XML(三)—— Sax方式

http://blog.csdn.net/sunboy_2050/article/details/7521598 1. Sax概述 SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,不需要解析完整个文档,而是按照内容顺序看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法 定义在ContentH

Dream It Possible 763

Elasticsearch 8.17.1 JAVA工具类

整理了Elasticsearch8.17最新版的API工具类

weixin_39555954的博客 1123

基于Codex平台构建AI技能:抖音爆款分析与带货视频生成实战

这次我们来看一个基于 Codex 平台构建 AI 技能(Skill)的实战项目。核心目标很直接:利用 AI 能力,自动化分析抖音平台的爆款内容,并生成可用于带货的视频。这听起来像是内容创作领域的“自动化流水线”,它解决的核心痛点是:人工分析爆款、撰写脚本、制作视频的效率瓶颈。 对于技术开发者和内容创作者而言,这个项目的价值在于将“内容策略分析”和“视频内容生成”两个环节通过 Codex 的 Skill 机制串联起来,形成一个可定制、可批量执行的自动化工作流。我们最关心的几个问题包括:这个方案的技术门槛高不高

weixin_29054399的博客 484

android sax创建xml文件

前两篇文章,对sax解析xml的方式简单说明,实现解析的功能。下面用sax来创建xml文件。 具体的如何使用sax创建xml,在程序中都加了相关的注释,还是直接上代码. package cn.com.sax; import java.io.OutputStream; import java.io.StringWriter; import javax.xml.transform.Outp

Carson IT之旅 3501

esp32c6 开发实战:低功耗蓝牙(BLE)开发

蓝牙栈在此程序流程中已经启动并运行,但是应用程序的功能尚未定义。功能的定义是通过响应事件来实现的,当其他设备尝试读取或写入参数以及建立连接时就会触发事件回调函数处理。BT控制器在控制器端实现主机控制器接口(HCI),链路层(LL)和物理层(PHY)。BT控制器对用户应用程序不可见,并处理BLE堆栈的较低层。蓝牙堆栈(Bluedroid stack)定义了经典蓝牙(BT Classic)和低功耗蓝牙(BLE)的通用定义和API。的判断)等对于启动低功耗蓝牙来说不重要的代码,函数初始化和启用BT控制器。

月入鱼饵的博客 2740

XML解析(一),SAX解析XML

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

宿罪的博客 3万+

Python爬虫实战:采集菜谱网站数据——以“下厨房”为例

随着互联网的发展,海量优质数据为各类应用提供了坚实基础。菜谱作为用户日常生活中需求极高的内容,丰富多样的菜谱数据不仅方便用户烹饪,也为美食推荐、营养分析等研究提供了数据支持。本文将围绕国内知名菜谱网站“下厨房”(https://www.xiachufang.com)展开,结合最新Python爬虫技术,详细讲解如何高效、规范地采集菜谱数据,包括菜谱名称、食材、步骤、评分、评论等丰富信息。全篇覆盖爬虫原理、框架选型、反爬应对、数据存储和简单分析,是学习爬虫实战的绝佳案例。菜谱标题作者信息菜谱图片。

2201_76125261的博客 1897

YOLOv8模型压缩终极方案:LAMP剪枝实战,速度提升不掉点

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

LXY_LOVE36的博客 174

SAX解析XML 详解

SAX解析XML 详解

此生尽兴 7812

Python自动化脚本:模拟鼠标键盘保持电脑在线状态

在计算机自动化领域,模拟用户输入是一项基础且实用的技术,其核心原理是通过程序生成鼠标或键盘事件来与操作系统交互。这项技术的价值在于能够自动化重复性操作,提升工作效率,并解决特定场景下的系统交互问题。PyAutoGUI作为Python生态中广泛使用的自动化库,封装了跨平台的底层API调用,为开发者提供了简洁统一的接口来实现输入模拟。在实际工程实践中,这类技术常应用于自动化测试、远程办公辅助、数据抓取等场景,帮助用户保持系统活跃状态,防止因无操作导致的锁屏或休眠中断任务。通过合理配置移动间隔和随机化模式,可以更

weixin_28713299的博客 578

XML——XML解析之SAX

本文详细介绍了使用SAX解析XML文档的机制和方法

Gavin 1970

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Python之SAX解析XML

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

起风了 3832

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android之SAX解析XML

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

bear_huangzhen的专栏 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

XML解析之SAX方式

XML解析之SAX方式解析xml文件 SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。优点是:在读取文档的同时即可对XML进行处理,不必等到文档加载结束,相对快捷。不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML。缺点是:只能用来读取XML中数据,无法进行增删改。 SAX解析可分四个步骤进行: 1、得到xml文

Fisher 2891

SAX解析XML

SAX解析XML 1.XML(Extensible Markup Language 可扩展标记语言),XML是一个以文本来描述数据的文档。 XML文档示例: <?xml version="1.0" encoding="UTF-8" ?> <people> <person personId="E01"> <name>Tony Blair</name> <address>10 Downing Stre

七一 1654

java sax解析xml_Java Sax解析xml

1. Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode。如下面的这段book.xmlthinking in java85.5Spring in Action39.0其中,像、这种节点就属于ElementNode,而thinking in java、85.5这种就属于Text...

weixin_28785681的博客 270

sax解析xml

通sax方式解析xml import com.kq.entity.Student; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import java...

kongkong的专栏 599
上一篇: XML的解析DOM
下一篇: XML解析PULL
cding1818
博客等级 码龄17年 963粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值