Java数据解析---SAX

一、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 }

(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]

控制台输出效果

时间: 2024-10-24 22:21:33

Java数据解析---SAX的相关文章

Java数据解析---PULL

安卓和JAVA解析xml文件的三种方式: 1.PULL解析 2.SAX解析 3.DOM解析 三者各有所长,依情况选择解析方式 1.PULL和SAX均采用流式解析,意味着只能从头读到底,无法像DOM解析一样随机访问xml文件中的任意一个节点 2.PULL和SAX占用更少的内存解析,更适用于安卓上的解析xml文件 3.DOM解析时将文件全部解析完,最后让用户任意取特定的信息 ---------------------------------------------------------------

数据解析--sax解析

SAX解析XML SAX是Simple API for XML的缩写,SAX是基于事件驱动的,在用SAX解析xml文档时候,在读取到文档开始和结束标签时候就会回调一个事件,在读取到其它节点与内容时也会回调一个事件.事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件.事件处理器是DefaultHandler,与DOM比较而言,SAX是一种轻量型的方法.当需要一个速度快的解析器并且希望最大限度的减少应用程序的内存占用时,通常可以使用SAX解

XML数据解析 SAX解析(内容解析)

本文使用的XML文档形式:与上一篇文章的XML文档格式是不同的,解析方法稍做改动 给出关键代码截图:其余部分去前面的文章中找,复制下来,修改后自己写一下. 如果你对代码中所写的逻辑不清楚,说明对XML文档的格式和NSXMLParser那几个代理方法执行顺序还不清楚,自己看看不同格式的XML文档中代理方法的执行顺序就OK了, 补充:使用NSURLSession后就忽略了线程的概念,本意是不需要我们管理的.知道一下还是好的 NSXMLParser的代理方法都是在子线程执行,以及\下面的代码都是在子线

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

【Java编程】SAX XML Parser解析、生成XML文件

1.优缺点 优点: SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题.其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求.由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用.支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手. 缺点: 但是同时,其仍然有一些不足

网络相关系列之四:数据解析之SAX方式解析XML数据

一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这样的数据会有一定的结构规格和语言,当还有一方收到数据消息后就能够依照同样的结构规格进行解析.从而取出它想要的那部分内容. 在网络上数据传输最经常使用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数

java学习----数据解析

在讲数据解析之前,由于笔者目前能力有限,所以我只能先讲一下XML解析,后面的时间会补上其他数据的解析 讲解目录: 1.何为数据解析 2.xml解析 3.Excel解析 4.json解析 一.何为数据解析 举个栗子----如果不同的程序之间需要通信,假如说A程序需要B程序做一件事,B程序说 我可以做这件事,但是你不需要给我必须的数据.我才能做这件事. 我们可以用下面一副图表示: 在上面这幅图中,两个数据的传输都是有数据格式的.我们要做的就是解析这种数据格式或者生成这种数据格式的数据 二.XML解析

iOS中的数据解析(XML,JSON),SAX解析,DOM解析

第三方 SAT解析 #import "SAXTableViewController.h" #import "Student.h" @interface SAXTableViewController ()<NSXMLParserDelegate> @property (nonatomic, retain) NSMutableArray *dataSourse; // 存储学生对象 @property (nonatomic, retain) Student

Java反射机制实现微信公众平台XML数据解析

在做微信公众平台开发时,接收消息中有很多种类型的xml消息,比如"文本消息""图片消息""语音消息""视频消息""链接消息""地理位置消息"等等,最初在开发时针对每一种数据格式写了一个实体类,单独做解析,当然这样写的好处是层次分明.但经过尝试之后,用一个统一的实体类消息做处理,更加高效,当然,里面最核心的就是在遍历xml数据时,通过反射的机制动态调用set方法: 1.ReceiveXml