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. Tips4:把 Inspector面板转换为Debug模式

    你知道 Inspector 的调试(debug)模式吗? 当debug模式打开后, Inspector将会把游戏物体所有的属性都显示出来,包括公有(public)和私有(private)变量. 例如, ...

  2. js-条件语句、循环语句

    一. 常见条件语句 if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码 if...else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码 if... ...

  3. HQueue:基于HBase的消息队列

    HQueue:基于HBase的消息队列   凌柏   ​1. HQueue简介 HQueue是一淘搜索网页抓取离线系统团队基于HBase开发的一套分布式.持久化消息队列.它利用HTable存储消息数据 ...

  4. undefined reference to `omp_get_max_threads'

    原因是缺少 libgomp/openmp 库的链接 配置和解决方法参考: http://www.code-by.org/viewtopic.php?f=54&t=163

  5. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

  6. SQL Server 2008 FILESTREAM特性管理文件

    在SQL Server 2008中,新的FILESTREAM(文件流)特性和varbinary列配合,你可以在服务器的文件系统上存储真实的数据,但可以在数据库上下文内管理和访问,这个特性让SQL Se ...

  7. 【转】MSMQ消息队列安装

    一.Windows 7安装.管理消息队列1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.   具体步骤:    开始—>控制面板—>程 ...

  8. 大话设计模式-->模板方法设计模式

    在学习java的过程中,我们肯定听到过设计模式这名词,在行业中有这么一句话,若您能熟练的掌握23种设计模式,那么你便是大牛! 好了,废话不多说,今天我跟大家分享一下23种设计模式之一的  模板方法 设 ...

  9. SqlServer知识点记录分享

    知识点介绍 双向检索:这里就不大话概念了,直接说它的作用 ISNULL()函数:判断函数是否有值,如果变量没有赋值就给定指定的值,下面的例子就是如果@TOTALCOUNT变量为NULL那么就赋值为空字 ...

  10. JavaMail入门第五篇 解析邮件

    上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式.规范复杂得很.不过,我们所用的浏览器内置了解析各种数据类 ...