Java使用SAM解析XML
来源:互联网 发布:手机淘宝怎么追加评价 编辑:程序博客网 时间:2024/05/18 01:31
上一篇文章中讲述了如何使用DOM解析XML,这篇文章讲一下使用SAM(Simple API for XML)解析XML.
XML文件如下:
<?xml version="1.0" encoding="UTF-8"?><books><book id="1"><name>java入门</name><price>35.9</price></book><book id="2"><name>java精通</name><price>89.6</price></book></books>
创建三个类
Book.java
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 "Id is :"+this.id+"; Name is:"+this.name+"; Price is:"+this.price; } }
SAXTool.java
public class SAXTool { public SAXTool() {// TODO Auto-generated constructor stub}public List <Book> getBookList(InputStream xmlStream) throws Exception {// TODO Auto-generated constructor stub//获取SAXFactory实例SAXParserFactory factory = SAXParserFactory.newInstance();//通过factory获取SAXParserSAXParser parser = factory.newSAXParser();//实例化一个解析工具SAXUtil handler = new SAXUtil();//解析文件/*SAX解析是边读边解析,所以读到一个element要素 *就回调handler中重写的相关方法*/parser.parse(xmlStream, handler);return handler.getBookList();} }
SAXUtil.java
public class SAXUtil extends DefaultHandler {private List<Book> booklist = null;private Book book;private String preTag = null;// 作用是记录解析时的上一个节点名称public SAXUtil() {// TODO Auto-generated constructor stub}public List<Book> getBookList(){return booklist;}@Overridepublic void startDocument() throws SAXException {booklist = new ArrayList<Book>();}/** * 收到一个元素开始的通知 * Receive notification of the start of an element. * * <p> * By default, do nothing. Application writers may override this method in a * subclass to take specific actions at the start of each element (such as * allocating a new tree node or writing output to a file). * </p> * * @param uri * The Namespace URI, or the empty string if the element has no * Namespace URI or if Namespace processing is not being * performed. * @param localName * The local name (without prefix), or the empty string if * Namespace processing is not being performed. * @param qName * The qualified name (with prefix), or the empty string if * qualified names are not available. * @param attributes * The attributes attached to the element. If there are no * attributes, it shall be an empty Attributes object. * @exception org.xml.sax.SAXException * Any SAX exception, possibly wrapping another exception. * @see org.xml.sax.ContentHandler#startElement */@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// no opif ("book".equals(qName)) {book = new Book();book.setId(Integer.parseInt(attributes.getValue(0)));}preTag = qName;}/** * 收到一个字符数据通知 * Receive notification of character data inside an element. * * <p> * By default, do nothing. Application writers may override this method to * take specific actions for each chunk of character data (such as adding * the data to a node or buffer, or printing it to a file). * </p> * * @param ch * The characters. * @param start * The start position in the character array. * @param length * The number of characters to use from the character array. * @exception org.xml.sax.SAXException * Any SAX exception, possibly wrapping another exception. * @see org.xml.sax.ContentHandler#characters */@Overridepublic 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));}}}/** * 收到一个元素结束的通知 * Receive notification of the end of an element. * * <p> * By default, do nothing. Application writers may override this method in a * subclass to take specific actions at the end of each element (such as * finalising a tree node or writing output to a file). * </p> * * @param uri * The Namespace URI, or the empty string if the element has no * Namespace URI or if Namespace processing is not being * performed. * @param localName * The local name (without prefix), or the empty string if * Namespace processing is not being performed. * @param qName * The qualified name (with prefix), or the empty string if * qualified names are not available. * @exception org.xml.sax.SAXException * Any SAX exception, possibly wrapping another exception. * @see org.xml.sax.ContentHandler#endElement */@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if ("book".equals(qName)) {booklist.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,这不是我们想要的。 */}}
在调用方法:
try {InputStream fins = new FileInputStream("book.xml");SAXTool Saxtool = new SAXTool();List<Book> booklist = (List<Book>) Saxtool.getBookList(fins);for (Book book : booklist) {System.out.println(book.toString());}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}
输出结果:
0 0
- Java使用SAM解析XML
- 解析XML文件之使用SAM解析器
- 解析XML文件之使用SAM解析器
- 解析XML文件之使用SAM解析器
- sam怎样解析xml 有详细注释
- SAM解析XML的经典笔记(1)
- 使用java解析XML文件
- java解析xml:使用DOM
- java 使用 dom4j 解析 XML
- JAVA使用DOM解析XML
- java使用sax解析xml
- java 使用dom4j解析xml
- JAVA 使用Dom4j 解析XML
- java使用dom4j解析xml
- 使用Java解析XML文档
- JAVA 使用 DOM 解析 XML
- Java使用DOM解析XML
- JAVA 使用Dom4j 解析XML
- 蓝桥杯 查找整数(循环 判断)
- spring中配置数据源
- HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good
- centos下编译glib Library并安装
- 项目开发之代码优化
- Java使用SAM解析XML
- Spring如何处理线程并发
- 螺旋矩阵
- [LeetCode] 判断两个链表是否有公共节点并返回第一个公共节点
- 统计学中数据类型与几个基本概念
- 1
- ZYB's Game解题报告
- volatile及指令重排序
- 前端行记1---less接触