sax解析分为以下几步:

1 获取一个saxparserfactory

2 获取一个解析器

3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类,这个实现类里写具体的解析逻辑

4 开始解析xml。

结构层次图:

具体如下面的代码:

mySAXparser:

package com.imooc.test;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class mySAXparser {
public static void main(String[] args) {
//1 获取一个saxparserfactory
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
//2 获取一个解析器
SAXParser parser = factory.newSAXParser();
/*
* 3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类
* 这个实现类里写具体的解析逻辑
*/
myHandler handler = new myHandler();
//4 开始解析xml,
parser.parse("books.xml",handler); } catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

  myHandler:

package sax;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class myHandler extends DefaultHandler {
int i =0;
int j = 0;
String value = null;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("startDocument开始解析.............."); } @Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("endDocument结束解析............");
} @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
/*
* qName:The qualified name (with prefix),
* or the empty string if qualified names are not available.
* qName:实际上就是标签名的名字,如<sex>1</sex> 那么qName就代指的这个标签名,sex
*
*/
if(qName.equals("book")){
i++;
String value = attributes.getValue("size");
int len = attributes.getLength();
System.out.println("len:"+len);
for(int k=0;k<len;k++){
int m = k+1;
System.out.println("属性"+m+":"+attributes.getQName(k));
}
System.out.println("book.size:"+value);
System.out.println("第"+i+"处,解析到book元素的标签。。。");
}
if(qName.equals("bookstore")){
j++;
System.out.println("第"+j+"处,解析到bookstore元素的标签。。。");
} } @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("第"+i+",endElement结束"); } @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
//new String(ch, start, length)用来生成一个元素中标签之间的具体的文本
value = new String(ch, start, length);//加入正好解析到<name>冰与火之歌</name>时,那么value="冰与火之歌"
System.out.println("================节点值是:" + value);
if (!value.trim().equals("")) { System.out.println(i+"节点值是:" + value);
}
}
}

  

  books.xml:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id="2">
<name>安徒生童话</name>
<year>2004</year>
<price>77</price>
<language>English</language>
</book>
</bookstore>

  解析结果下:

startDocument开始解析..............
第1处,解析到bookstore元素的标签。。。
================节点值是:

len:2
属性1:id
属性2:size
book.size:23
第1处,解析到book元素的标签。。。
================节点值是:

================节点值是:冰与火之歌
1节点值是:冰与火之歌
第1,endElement结束
================节点值是:

================节点值是:乔治马丁
1节点值是:乔治马丁
第1,endElement结束
================节点值是:

================节点值是:2014
1节点值是:2014
第1,endElement结束
================节点值是:

================节点值是:89
1节点值是:89
第1,endElement结束
================节点值是:

第1,endElement结束
================节点值是:

len:1
属性1:id
book.size:null
第2处,解析到book元素的标签。。。
================节点值是:

================节点值是:安徒生童话
2节点值是:安徒生童话
第2,endElement结束
================节点值是:

================节点值是:2004
2节点值是:2004
第2,endElement结束
================节点值是:

================节点值是:77
2节点值是:77
第2,endElement结束
================节点值是:

================节点值是:English
2节点值是:English
第2,endElement结束
================节点值是:

第2,endElement结束
================节点值是:

第2,endElement结束
endDocument结束解析............

sax解析的myHandler这个类继承了DefaultHandler,具体的解析逻辑就是写在这个myHandler

中,覆盖的方法的执行顺序是:

1. startDocument()

2.

startElement(String uri, String localName, String qName,
Attributes attributes)

3. endElement(String uri, String localName, String qName)

4. characters(char[] ch, int start, int length)

...

n. endDocument()

其中的...省略号部分一直重复的执行2,3,4两个步骤,主要是根据xml的具体情形,遇到一个具体元素就会执行2,3,4三个步骤一次。如上面的

xml中的

<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>

,这样就会重复执行2,3,4步骤四次。

SAX方式解析XML的更多相关文章

  1. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  2. (四)SAX方式解析XML数据

    SAX方式解析XML数据 ​文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...

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

    一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...

  4. Java&Xml教程(五)使用SAX方式解析XML文件

    Java SAX解析机制为我们提供了一系列的API来处理XML文件,SAX解析和DOM解析方式不太一样,它并不是將XML文件内容一次性全部加载,而是连续的部分加载. javax.xml.parsers ...

  5. 用JAXP的SAX方式解析XML文件

    简单用JAXP的SAX方式(事件驱动)解析XML文件: 文件(1.XML) <?xml version="1.0" encoding="UTF-8" st ...

  6. Java眼中的XML--文件读取--2 应用SAX方式解析XML

    1.获取一个SAXParserFactory的实例.2.通过factory获取SAXParser实例.  3.新建一个包和继承自DefaultHandler的类.  因为SAX遍历方式,比如便利一个节 ...

  7. SAX方式解析XML文件实例

    books.XML文件: 书籍book.java实体类: public class Book { private String id; private String name; private Str ...

  8. sax方式解析XML学习笔记

    原理:对文档进行顺序扫描,当扫描到文档(document)开始与结束,元素开始与结束.文档结束等地方 通知事件处理函数,由事件处理函数相应动作然后继续同样的扫描,直至文档结束. 优点:消耗资源比较少: ...

  9. 使用SAX方式解析XML文件

    package com.pingyijinren.test; import android.util.Log; import org.xml.sax.Attributes; import org.xm ...

随机推荐

  1. 使用C#对MongoDB中的数据进行查询,改动等操作

    首先,使用的是官方提供的C#訪问组件https://github.com/mongodb/mongo-csharp-driver 然后.编译后引用MongoDB.Bson.dll及MongoDB.Dr ...

  2. [置顶] 局部加权回归、最小二乘的概率解释、逻辑斯蒂回归、感知器算法——斯坦福ML公开课笔记3

    转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9113681 最近在看Ng的机器学习公开课,Ng的讲法循循善诱,感觉提高了不少 ...

  3. Arduino101 中使用 Mirf 库的问题(2016-04-04)

    Mirf 库在使用 NRF24L01 的时候接触到,感觉很好用.但在用 Arduino101 的时候遇到一些问题,记录一下,对于底层不了解,希望有熟悉的同学能给点指点: 编译会提示 MirfHardw ...

  4. Android 屏幕尺寸知识

    转自:http://www.zcool.com.cn/article/ZNjI3NDQ=.html 1.了解几个概念 (1)分辨率.分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏 ...

  5. C和指针---读书笔记。

    C和指针---读书笔记.1,unsigned int  声明无符号int类型 默认是 singned,即此整数类型包括正负数.也可用于long上.说明符有 unsigned signed short ...

  6. VS QT 配置OpenGL

    在visual studio 下编译OpenGL代码出现以下错误,原因是vs没有自带opengl库,需要自己引入 无法解析的外部符号 __imp__glClear@4 无法解析的外部符号 __imp_ ...

  7. 转:30分钟掌握STL

    三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有 ...

  8. poj 1056 IMMEDIATE DECODABILITY(KMP)

    题目链接:http://poj.org/problem?id=1056 思路分析:检测某字符串是否为另一字符串的前缀,数据很弱,可以使用暴力解法.这里为了练习KMP算法使用了KMP算法. 代码如下: ...

  9. DIOR HOMME_百度百科

    DIOR HOMME_百度百科     DIOR HOMME    编辑    Dior Homme 男装品牌,中文名迪奥·桀傲,由迪奥 (Dior) 在2001年更名更来,品牌来源地法国.迪奥·桀傲 ...

  10. switch case ,while, do while,enum

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace C_编辑 ...