上次學習的是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的函數 被覆蓋的函數默認情況下,不執行任何操作。