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. Linux文件查找工具之find “大宝剑”--转载

    原文地址:http://xinzong.blog.51cto.com/10018904/1749465 一.文件查找工具常用软件 locate: locate命令其实是find -name的另一种写法 ...

  2. Robot Framework自动化测试(一)---第一个脚本

    最近工具中用Robot Framework框架来做自动化,所以,花时间学习了一下. =======所需环境=================== Python: https://www.python. ...

  3. CentOS 7.2 MySQL 5.7 主从配置

    MySQL的安装:CentOS 7.2 yum方式安装MySQL 5.7 两台服务器分别如下: Master:192.168.1.100 Slave:192.168.1.101 Master配置: 编 ...

  4. 小printf的故事(未完待续)

    小printf的故事 这篇文章的原文来自:英文原文作者仿照<小王子>中的情节,生动有趣的阐述了小printf从编程小白到专家的成长历程.这是我第一次尝试翻译文章,肯定有很多不足之处,情不要 ...

  5. Android学习笔记(第二篇)View中的五大布局

    PS:人不要低估自己的实力,但是也不能高估自己的能力.凡事谦为本... 学习内容: 1.用户界面View中的五大布局... i.首先介绍一下view的概念   view是什么呢?我们已经知道一个Act ...

  6. C#中得到两个数百分比 (转)

    //此方法得到的百分比后小数太多,不行double percent=Convert.ToDouble(2)/Convert.ToDouble(34); string result=(percent*1 ...

  7. [迷宫中的算法实践]迷宫生成算法——递归分割算法

    Recursive division method        Mazes can be created with recursive division, an algorithm which wo ...

  8. web服务器之nginx与apache

    最近准备架设php的web服务器,以下内容可供参考. 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞 ...

  9. U-boot的环境变量值得注意的有两个: bootcmd 和bootargs

    本文转载至:http://www.cnblogs.com/cornflower/archive/2010/03/27/1698279.html U-boot的环境变量值得注意的有两个: bootcmd ...

  10. CodeForces 149D Coloring Brackets

    Coloring Brackets time limit per test: 2 seconds memory limit per test: 256 megabytes input: standar ...