Java数据解析---SAX

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一、Sax解析 是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档。 Sax采用事件驱动的方式解析文档。简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或...

 一、Sax解析

是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档。

Sax采用事件驱动的方式解析文档。简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取)

在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或处理这些信息

同样,在Sax的解析过程中,读取到文档开头、结尾,元素的开头和结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理

这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement

此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容

将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的解析器

一般从Main方法中读取文档,却在解析器中处理文档,这就是所谓的事件驱动解析方法(解释为转载)

------------------------------------------------------------------------------------------------------------------------------------------------------

解析器中的方法:

1.解析文档开头

1 @Override
2     public void startDocument() throws SAXException {
3         // TODO Auto-generated method stub
4         super.startDocument();
5     }

 

2.解析开始标签

1 @Override
2     public void startElement(String uri, String localName, String qName,
3             Attributes attributes) throws SAXException {
4         // TODO Auto-generated method stub
5         super.startElement(uri, localName, qName, attributes);
6     }

 

3.解析内容

1 @Override
2     public void characters(char[] ch, int start, int length)
3             throws SAXException {
4         // TODO Auto-generated method stub
5         super.characters(ch, start, length);
6     }

 

4.解析结束标签

1 @Override
2     public void endElement(String uri, String localName, String qName)
3             throws SAXException {
4         // TODO Auto-generated method stub
5         super.endElement(uri, localName, qName);
6     }

 

5.解析文档结束

1 @Override
2     public void endDocument() throws SAXException {
3         // TODO Auto-generated method stub
4         super.endDocument();
5     }

 

下面看一个Demo来实现解析一个xml文件

(1).xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persons>
 3     <person>
 4         <name>张三</name>
 5         <age>30</age>
 6         <sex>男</sex>    
 7     </person>
 8     
 9     <person>
10         <name>李四</name>
11         <age>32</age>
12         <sex>女</sex>
13     </person>
14     
15     <person>
16         <name>王五</name>
17         <age>30</age>
18         <sex>男</sex>
19     </person>
20 </persons>
user.xml

(2)解析器

  1 package saxparser;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import org.xml.sax.Attributes;
  7 import org.xml.sax.SAXException;
  8 import org.xml.sax.helpers.DefaultHandler;
  9 
 10 public class Myhandle extends DefaultHandler{
 11     //一个列表集合用来存放对象
 12     List<Student> list = null;
 13     Student stu = null;
 14     //存放标签名称
 15     String str = null;
 16     //文件开始
 17     @Override
 18     public void startDocument() throws SAXException {
 19         // TODO Auto-generated method stub
 20         super.startDocument();
 21         System.out.println("文件解析开始");
 22         //准备工作,创建列表集合对象
 23         list = new ArrayList<Student>();
 24     }
 25     //标签开始
 26     @Override
 27     public void startElement(String uri, String localName, String qName,
 28             Attributes attributes) throws SAXException {
 29         // TODO Auto-generated method stub
 30         super.startElement(uri, localName, qName, attributes);
 31         str=qName;
 32         //标签到这里说明有<person>数据了,需要创建一个Student对象存放解析出来的数据
 33         if("person".equals(str))
 34         {
 35             stu = new Student();
 36 //    if(attributes!=null)  如果标签<person>里有属性的话
 37 //            {
 38 //                for(int i=0;i<attributes.getLength();i++)
 39 //                {
 40 //                    //得到属性名
 41 //                    String attrName = attributes.getQName(i);
 42 //                    //得到属性值
 43 //                    String attrValue = attributes.getValue(i);
 44 //                    
 45 //                    if("id".equals(attrName))
 46 //                    {
 47 //                        stu.setId(attrValue);
 48 //                    }
 49 //                }
 50 //            }
 51         }
 52     }
 53     //内容解析
 54     @Override
 55     public void characters(char[] ch, int start, int length)
 56             throws SAXException {
 57         // TODO Auto-generated method stub
 58         super.characters(ch, start, length);
 59         //获得解析的标签内容
 60         String s = new String(ch,start,length);
 61         if("name".equals(str))
 62         {
 63             stu.setName(s);
 64         }
 65         else if("age".equals(str))
 66         {
 67             stu.setAge(Integer.parseInt(s));
 68         }
 69         else if("id".equals(str))
 70         {
 71             stu.setAge(Integer.parseInt(s));
 72         }
 73     }
 74     //结束标签解析
 75     @Override
 76     public void endElement(String uri, String localName, String qName)
 77             throws SAXException {
 78         // TODO Auto-generated method stub
 79         super.endElement(uri, localName, qName);
 80         //注意这里,存放标签名字的str字符串必须要置空,=null or =""
 81         str=null;
 82         if("person".equals(qName))
 83         {
 84             list.add(stu);
 85         }
 86     }
 87     //结束文件解析
 88     @Override
 89     public void endDocument() throws SAXException {
 90         // TODO Auto-generated method stub
 91         super.endDocument();
 92         System.out.println("文件解析结束");
 93     }
 94     
 95     public List<Student> list(){
 96         return list;//返回列表集合
 97     }
 98 }
 99 
100 Myhandle.java 解析器
Myhandle.java解析器

(3)测试类

 1 package saxparser;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 import javax.xml.parsers.ParserConfigurationException;
 9 import javax.xml.parsers.SAXParser;
10 import javax.xml.parsers.SAXParserFactory;
11 
12 import org.xml.sax.SAXException;
13 
14 public class Text {
15     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
16         //创建解析的工厂类对象
17         SAXParserFactory factory = SAXParserFactory.newInstance();
18         //创建解析器对象
19         SAXParser parser = factory.newSAXParser();
20         
21         File f= new File("user.xml");
22         //解析器去读取xml文件并去调用handle里边的函数
23         Myhandle handle = new Myhandle();
24         parser.parse(f, handle);
25         //获得存放Student对象的集合
26         List<Student> list = handle.list;
27         //遍历集合
28         for(int i=0;i<list.size();i++)
29         {
30             System.out.println(list.get(i));
31         }
32         
33     }
34 }
View Code

 (4).对象类

 1 package saxparser;
 2 
 3 public class Student {
 4     private int id;
 5     private String name ;
 6     private int age;
 7     public Student() {
 8         super();
 9         // TODO Auto-generated constructor stub
10     }
11     public Student(int id, String name, int age) {
12         super();
13         this.id = id;
14         this.name = name;
15         this.age = age;
16     }
17     public int getId() {
18         return id;
19     }
20     public void setId(int id) {
21         this.id = id;
22     }
23     public String getName() {
24         return name;
25     }
26     public void setName(String name) {
27         this.name = name;
28     }
29     public int getAge() {
30         return age;
31     }
32     public void setAge(int age) {
33         this.age = age;
34     }
35     @Override
36     public String toString() {
37         return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
38     }
39     
40     
41 }
Student

(5)控制台输出信息

1 文件解析开始
2 文件解析结束
3 Student [id=0, name=张三, age=30]
4 Student [id=0, name=李四, age=32]
5 Student [id=0, name=王五, age=30]
控制台输出效果

 

相关文章
|
14天前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
|
24天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
33 6
|
20天前
|
Java 编译器
Java 泛型详细解析
本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。
30 2
Java 泛型详细解析
|
20天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
50 12
|
17天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
17天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
18天前
|
XML JSON JavaScript
HttpGet 请求的响应处理:获取和解析数据
HttpGet 请求的响应处理:获取和解析数据
|
19天前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
23天前
|
数据采集 存储 Web App开发
Java爬虫:深入解析商品详情的利器
在数字化时代,信息处理能力成为企业竞争的关键。本文探讨如何利用Java编写高效、准确的商品详情爬虫,涵盖爬虫技术概述、Java爬虫优势、开发步骤、法律法规遵守及数据处理分析等内容,助力电商领域市场趋势把握与决策支持。
|
21天前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
24 3

推荐镜像

更多
下一篇
DataWorks