博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SAX解析XML文档之二
阅读量:4103 次
发布时间:2019-05-25

本文共 3135 字,大约阅读时间需要 10 分钟。

 

thinking in java
85.5
Spring in Action
39.0

 

 

package cn.sisy.xml;public class Book {	private int id;	private String name;	private float price;	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public float getPrice() {		return price;	}	public void setPrice(float price) {		this.price = price;	}	@Override	public String toString(){		return this.id+":"+this.name+":"+this.price;	}}

 

 

 

package cn.sisy.xml;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import cn.sisy.xml.Book;public class SaxParseService extends DefaultHandler{	private List
books = null; private Book book = null; private String preTag = null;//作用是记录解析时的上一个节点名称 public List
getBooks(InputStream xmlStream) throws Exception{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); SaxParseService handler = new SaxParseService(); parser.parse(xmlStream, handler); return handler.getBooks(); } public List
getBooks(){ return books; } @Override public void startDocument() throws SAXException { books = new ArrayList
(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("book".equals(qName)){ book = new Book(); book.setId(Integer.parseInt(attributes.getValue(0))); } preTag = qName;//将正在解析的节点名称赋给preTag } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("book".equals(qName)){ books.add(book); book = null; } preTag = null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法 ,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图 中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方 法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/ } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(preTag!=null){ String content = new String(ch,start,length); if("name".equals(preTag)){ book.setName(content); }else if("price".equals(preTag)){ book.setPrice(Float.parseFloat(content)); } } } }

 

 

package cn.sisy.xml;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.util.List;import junit.framework.TestCase;import cn.sisy.xml.SaxParseService;import cn.sisy.xml.Book;public class ParseTest extends TestCase{	public void testSAX() throws Throwable{		SaxParseService sax = new SaxParseService();		//InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");		InputStream input = new FileInputStream(new File("book.xml"));		List
books = sax.getBooks(input); for(Book book : books){ System.out.println(book.toString()); } }}

 

代码转载自: 

你可能感兴趣的文章
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>