歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> SAX解析XML文檔

SAX解析XML文檔

日期:2017/3/1 10:06:17   编辑:Linux編程

SAX采用事件處理器的方式解析XML文檔,利用SAX解析XML文檔,涉及兩個部分:解析器和事件處理器

解析器可以使用JAXP的API進行創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文檔

解析器在采用SAX方式解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都回去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前XML文件內容作為方法的參數傳遞給事件處理器

事件處理器有程序員編寫,程序員通過事件處理器中方法的參數,就可以很輕松地得到SAX解析器得到的數據,從而可以決定如何對數據進行處理

通過一個實例體驗一下,本實例通過讀取一個book.xml文檔,將book中內容封裝到一個Book對象中,並將多個Book對象放入LIst中返回,實例代碼如下:

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.ConcurrentMap;
  5. import javax.sql.rowset.spi.XmlReader;
  6. import javax.xml.parsers.ParserConfigurationException;
  7. import javax.xml.parsers.SAXParser;
  8. import javax.xml.parsers.SAXParserFactory;
  9. import org.xml.sax.Attributes;
  10. import org.xml.sax.ContentHandler;
  11. import org.xml.sax.Locator;
  12. import org.xml.sax.SAXException;
  13. import org.xml.sax.XMLReader;
  14. import org.xml.sax.helpers.DefaultHandler;
  15. public class SAXParesXML {
  16. /**
  17. * sax parse
  18. * @throws SAXException
  19. * @throws ParserConfigurationException
  20. * @throws IOException
  21. */
  22. public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
  23. // 創建解析工廠
  24. SAXParserFactory factory = SAXParserFactory.newInstance();
  25. // 得到解析器
  26. SAXParser sp = factory.newSAXParser();
  27. // 得到讀取器
  28. XMLReader reader = sp.getXMLReader();
  29. //設置內容處理器
  30. BeanListHandler beanListHandler = new BeanListHandler();
  31. reader.setContentHandler(beanListHandler);
  32. //讀取xml文檔內容
  33. reader.parse("src/book.xml");
  34. List<Book> books = beanListHandler.getBooks();
  35. //遍歷輸出
  36. //...
  37. }
  38. }
  39. // 把xml的每一本書封裝到Book對象中,並把多個Book對象封裝到List中返回
  40. class BeanListHandler extends DefaultHandler {
  41. private List books = new ArrayList();
  42. private String currentTag;
  43. private Book book;
  44. public List getBooks() {
  45. return books;
  46. }
  47. @Override
  48. public void startElement(String uri, String localName, String qName,
  49. Attributes attributes) throws SAXException {
  50. if ("book".equals(currentTag)) {
  51. book = new Book();
  52. }
  53. }
  54. @Override
  55. public void characters(char[] ch, int start, int length)
  56. throws SAXException {
  57. if ("name".equals(currentTag)) {
  58. book.setName(new String(ch, start, length));
  59. }
  60. if ("author".equals(currentTag)) {
  61. book.setAuthor(new String(ch, start, length));
  62. }
  63. if ("price".equals(currentTag)) {
  64. book.setPrice(new String(ch, start, length));
  65. }
  66. }
  67. @Override
  68. public void endElement(String uri, String localName, String qName)
  69. throws SAXException {
  70. if (qName.equals("book")) {
  71. books.add(book);
  72. book = null;
  73. }
  74. currentTag = null;
  75. }
  76. }

Book類代碼如下:

  1. public class Book {
  2. private String name;
  3. private String author;
  4. private String price;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public String getAuthor() {
  12. return author;
  13. }
  14. public void setAuthor(String author) {
  15. this.author = author;
  16. }
  17. public String getPrice() {
  18. return price;
  19. }
  20. public void setPrice(String price) {
  21. this.price = price;
  22. }
  23. }

book.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <bookstore>
  3. <book>
  4. <name>C++ l</name>
  5. <author>Lippman</author>
  6. <title>cpp</title>
  7. </book>
  8. <book>
  9. <name>C++ h</name>
  10. <author>houjie</author>
  11. <title>stl</title>
  12. </book>
  13. </bookstore>
Copyright © Linux教程網 All Rights Reserved