xml文件解析之sax解析

来源:互联网 发布:python网页版安装 编辑:程序博客网 时间:2024/05/22 15:24

java的SAX方式解析xml时,解析类需要继承DefaultHandler类,并覆写startDocument、startElement、characters、endElement和endDocument方法。

示例如下:

 

package com.benny.demo.xml;import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.helpers.DefaultHandler;/** * TODO 这里添加描述 *  * @author xiaobing * @version V 1.0 * @since 2014-5-21 */public class MyHandler extends DefaultHandler{private List<Book> books;private String currentTag;private Book book;/** * 构造方法 */public MyHandler(){// TODO Auto-generated constructor stub}public void startDocument(){books = new ArrayList<Book>();//初始化数据容器集合}public void startElement(String uri, String localName, String qName, Attributes attributes){if ("book".equals(qName))//根据qName判断读到的标,并根据标签确定当前要作的操作{book = new Book();//初始化存储数据对象for (int i = 0; i < attributes.getLength(); i++) //读取标签属性值{if ("id".equals(attributes.getQName(i))){book.setId(attributes.getValue(i));}}}currentTag = qName; //记录读取到下一个标签前的标签作为当前标签}public void characters(char ch[], int start, int length){String text = new String(ch, start, length); //此处读取到的值就是currentTag记录的标签的值if ("name".equals(currentTag)){book.setName(text);}else if ("price".equals(currentTag)){book.setPrice(text);}}public void endElement(String uri, String localName, String qName){if ("book".equals(qName)){books.add(book);//添加到集合中}currentTag = null;}public void endDocument(){//根据情况,此方法可不覆写}public List<Book> getBooks(){return books;}}


解析类调用方法如下:

public static void main(String[] args){File file = new File("d:\\books.xml");MyHandler handler = new MyHandler();try{InputStream is = new FileInputStream(file);SAXParser parser = SAXParserFactory.newInstance().newSAXParser();parser.parse(is, handler); //此方法无返回值,调用解析后,解析结果在handler中List<Book> books = handler.getBooks(); //从handler中取出解析后的数据for (Book book : books){System.out.println(book);}}catch (FileNotFoundException e){e.printStackTrace();}catch (ParserConfigurationException e){// TODO Auto-generated catch blocke.printStackTrace();}catch (SAXException e){// TODO Auto-generated catch blocke.printStackTrace();}catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}

 

从解析过程可以看出,我们采用sax解析时很多时候要根据读到的标签是什么来判断该做什么,所以sax解析的前提是我们要知道xml的内容格式,每个sax方式实现的解析都是针对特定格式的xml文件的,也就是拿着一个具体的xml了,然后才能去读它。


 附:

解析的xm文件内容如下:

<?xml version="1.0" encoding="utf-8"?><books><book id="1001"><name>Thinking In Java</name><price>80.00</price></book><book id="1002"><name>Core Java</name><price>90.00</price></book><book id="1003"><name>Hello, Andriod</name><price>100.00</price></book></books>  


 

0 0
原创粉丝点击