上次学习的是DOM解析见
天气预报Dom解析 见 http://www.linuxidc.com/Linux/2011-12/49439.htm这次我们来了解一下SAX是什么情况! 相对于DOM来说SAX在平时要用的多一下。在上次DOM学习中,我们也看见了,解析DOM,循环用的很多。那个XML简单,DOM树层次不深,说通俗点就像for循环一样嵌套的不多。如果很深的话用SAX就要方便的多了.... 在写上次程序的时候,我是边看xml 边写代码,需要看仔细些,我眼睛都看花了(可能是我变量名没定义好),另外定义那个变量时也不好弄 遍历时需要中间变量稍多些, 而且都是差不多意思差不多的变量...... 我们直接来看一下实例:books.xml
- <?xml version="1.0" encoding="utf-8"?>
- <books count="3"
- xmlns="http://test.org/books">
- <!--books"s comment-->
- <book>
- <id>1</id>
- <name>Thinking in JAVA</name>
- </book>
- <book>
- <id>2</id>
- <name>Core JAVA2</name>
- </book>
- <book>
- <id>3</id>
- <name>C++ primer</name>
- </book>
- <book>
- <id>4</id>
- <name>数据结构(严蔚敏)</name>
- </book>
- </books>
-
关于接下来要上的实例 我简单说一下,这次需要解析的是上面xml文件。 我们需要把xml文件中所有书的信息摘取下来,最后统一输出。
①类 book.java 用于保存一本书的信息 这里为了简单,xml文件就只是简单写了个ID,name 当然还有价钱等其他信息....
- public class Book
- {
- private int id;
- private String name;
- 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;
- }
-
- }
②类XmlHandler.java 负责处理,管理xml保存书籍信息..
- import java.util.ArrayList;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
-
-
- public class XmlHandler extends DefaultHandler
- {
- public ArrayList<Book> books ;
- private ArrayList<String> strList;
- private Book book;
- private StringBuilder sb = new StringBuilder();
- @Override
- public void startDocument() throws SAXException
- {
- books = new ArrayList<Book>();
- strList = new ArrayList<String>();
- super.startDocument();
- }
-
- @Override
- public void endDocument() throws SAXException
- {
-
- super.endDocument();
- }
-
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException
- {
-
- if(qName.equals("book"))
- {
- book = new Book();
- }
- super.startElement(uri, localName, qName, attributes);
- }
-
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException
- {
- strList.add(qName);
-
- if(qName.equals("book"))
- {
- books.add(book);
- }
- else if(qName.equals("id"))
- {
- book.setId(Integer.parseInt(sb.toString().trim()) );
-
- }
- else if(qName.equals("name"))
- {
- book.setName(sb.toString());
- }
-
-
- super.endElement(uri, localName, qName);
- }
-
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException
- {
- sb.setLength(0);
- String str = new String(ch,start,length);
- sb.append(str);
- super.characters(ch, start, length);
- }
-
- }
上面几个函数都是覆盖类DefaultHandler的函数 被覆盖的函数默认情况下,不执行任何操作。