1、获取一个SAXParserFactory的实例。2、通过factory获取SAXParser实例。

 3、新建一个包和继承自DefaultHandler的类。
 因为SAX遍历方式,比如便利一个节点<a></a>是需要startHandler便利起始标签<a>,还需要endHandler便利结束标签</a>。
 
4、将XML文件路径和SAXParserHandler实例对象作为 SAXParser对象 的参数使用。然后运行验证执行初始情况。
 5、在SAXParserHandler类中添加一个访问元素的方法,startElement。
6、所以需要进一步修改,条件过滤:
 不过,以上是已知标签属性名称的情况下使用的,getValue("id")获取属性值。下面是未知标签属性名称以及个数的情况下,怎么访问标签属性名和属性值。
 当我把XML的第一个book节点添加了一个属性和属性值,再运行上面的程序:
 7、解析XML文件的节点名和节点间文本。这里需要endElemet方法打印输出一个节点的访问结束。
然后还要重写一个方法characters方法,这个方法的第一个参数char[ ] ch这个是加载了整个xml的数据字节内容。
这里就直接上代码吧:
  注意这里用了去尾空格的方法,然后判断为空字符。这个方法比较巧妙。
 上代码吧:
 package com.goodboy.saxtest;

 import java.io.IOException;

 import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.goodboy.SAXParserHandler.SAXParserHandlerTest; public class SAXTest { public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser sax = factory.newSAXParser();
//创建一个SAXParserHandler对象
SAXParserHandlerTest handler = new SAXParserHandlerTest();
//作为参数使用
sax.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();
}
} }

SAXTest(main)

 package com.goodboy.SAXParserHandler;

 import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandlerTest extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("解析开始");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("=====开始访问节点"+qName+"=====");
//这里的qName是标签名
if (qName.equals("book") ) {
System.out.println("属性的个数:"+attributes.getLength());
for (int i = 0; i < attributes.getLength(); i++) {
String name = attributes.getQName(i);
System.out.println("属性名:"+name);
String value = attributes.getValue(i);
System.out.println("属性值:"+value);
}
}else if(!qName.equals("book") && !qName.equals("bookstore") ) {
System.out.print("属性名:"+qName);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("=====结束访问节点"+qName+"=====");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("解析结束");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String name = new String(ch, start, length);
if (!name.trim().equals("")) {
System.out.println(" 节点中的内容:"+name);
}
}
}

DefaultHandler对象

 最后  使用SAX解析将XML的内容和结构存入JAVA对象

1、建立一个book类:

 
 后续步骤就制作动态图片了,因为比较繁琐,就直接上代码了:
<理解的要点,就是这里面的重写的中间三个方法(startElement,characters,endElement),他们在解析XML的执行顺序,然后合理的结合这些方法的参数,合理的使用全局变量,将XML转为集合数据>
 package com.goodboy.SAXParserHandler;

 import java.util.ArrayList;

 import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import com.goodboy.entity.Book; public class SAXParserHandlerTest extends DefaultHandler {
Book book = null;
String value = null;
ArrayList<Book> booklist = new ArrayList<Book>();
public ArrayList<Book> getBooklist() {
return booklist;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("解析开始");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("=====开始访问节点"+qName+"=====");
//这里的qName是标签名,也是集合的元素名
if (qName.equals("book") ) {
book = new Book();
System.out.println("属性的个数:"+attributes.getLength());
for (int i = 0; i < attributes.getLength(); i++) {
if(attributes.getQName(i).equals("id")){
book.setId(attributes.getValue(i));
System.out.println("book.getId:"+book.getId());
}
}
}else if(!qName.equals("book") && !qName.equals("bookstore") ) {
System.out.print("属性名:"+qName);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String name = new String(ch, start, length);
if (!name.trim().equals("")) {
System.out.println(" 节点中的内容:"+name);
value = name;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("=====结束访问节点"+qName+"=====");
if (qName.equals("name")) {
book.setName(value);
}
if (qName.equals("author")) {
book.setAuthor(value);
}
if (qName.equals("year")) {
book.setYear(value);
}
if (qName.equals("prive")) {
book.setPrice(value);
}
if (qName.equals("language")) {
book.setLanguage(value);
}
if (qName.equals("book")) {
booklist.add(book);
book = null;
}
value = null;
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("book集合的长度"+booklist.size());
System.out.println(booklist.get(0).getName());
System.out.println("解析结束");
}
}
 
 
 
 
 
 
 

Java眼中的XML--文件读取--2 应用SAX方式解析XML的更多相关文章

  1. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /** * 短信的业务bean * @author Administrat ...

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

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

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

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

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

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

  5. Android程序解析XML文件的方法及使用PULL解析XML案例

    一.一般解析XML文件的方法有SAX和DOM.PULL (1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信 ...

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

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

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

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

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

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

  9. SAX方式解析XML

    sax解析分为以下几步: 1 获取一个saxparserfactory 2 获取一个解析器 3 创建handler对象,这个myHandler是继承了DefaultHandler的一个类,这个实现类里 ...

随机推荐

  1. Shell基础整理

     Shell的作用是将用户输入的文本命令转换成内核能识别的数据指令交给内核进行执行,内核需要翻译成二进制交由CPU底层来执行     用户层->Shell->调用对应应用程序->ke ...

  2. struts2 s:if标签以及 #,%{},%{#}的使用方法

    <s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session ...

  3. [爬虫学习笔记]用于提取网页中所有链接的 Extractor 模块

            Extractor的工作是从下载的网页中将它包含的所有URL提取出来.这是个细致的工作,你需要考虑到所有可能的url的样式,比如网页中常常会包含相对路径的url,提取的时候需要将它转换 ...

  4. 【循序渐进学Python】6.Python中的函数

    1. 创建函数 一个函数代表一个行为并且返回一个结果(包括None),在Python中使用def关键字来定义一个函数,如下: def hello(name): print 'hello,' + nam ...

  5. 重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++

    [源码下载] 重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++ 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 其它 C# ...

  6. Fluent NHibernate and Spring.net

    http://blog.bennymichielsen.be/2009/01/04/using-fluent-nhibernate-in-spring-net/ http://comments.gma ...

  7. [PHP] java读取PHP接口数据

    和安卓是一个道理,读取json数据 PHP文件: <?php class Test{ //日志路径 const LOG_PATH="E:\phpServer\Apache\logs\\ ...

  8. mongodb学习1---基本命令

    0:基本命令:1,登录mongodb数据库mongo 2,查看数据库,选择数据库show dbs;use table1; 3,查看集合show collections; 4,查看集合所有数据db.集合 ...

  9. Java final static abstract关键字介绍

    一,抽象类:abstract 1,只要有一个或一个以上抽象方法的类,必须用abstract声明为抽象类; 2,抽象类中可以有具体的实现方法; 3,抽象类中可以没有抽象方法; 4,抽象类中的抽象方法必须 ...

  10. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...