XML解析之SAX解析技術案例

Java代碼:

package com.xushouwei.xml;

 

import java.io.File;

import java.io.IOException;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

 

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

 

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

 

/**

 * SAX解析XML數據

 * 原理:

 * SAX解析器對XML文檔解析會從XML文檔開始位置起進行解析,同事根據已經定義好的事件處理器,來決定當前所解析的部分(元素、屬性、或是元素內容)是否有必要記錄並保存。相對於DOM解析,他的有點事佔用內存小查找速度更快點。

 * @author 徐守威

 *

 */

public class SAXParseDemo {

  

   public static void main(String[] args) {

      //創建解析XML文檔對象,其保存在E盤的根目錄下的article.xml

      File xmlFile=new File("E:\\article.xml");

      //創建一個SAXParserFactory對象,通過單例模式創建,SAXParserFactory對象相當於是SAXParser解析器的創建工程,通過SAXParserFactory.newInstance()方法創建SAXParserFactory對象

      SAXParserFactory factory=SAXParserFactory.newInstance();

      try {

         //從SAXParserFactory得到SAXParser對象

         SAXParser parser=factory.newSAXParser();

         //解析文件內容

         try {

            parser.parse(xmlFile, new MySaxHandler());

         } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

         }

      } catch (ParserConfigurationException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      } catch (SAXException e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }

     

   }

 

}

//因爲SAX解析是事件驅動的,因此我們這裏定義一個時間的監聽器對象,MySaxHandler,該類可以繼承DefaultHandler類,這類似Swing中的事件監聽器,這裏要了解一下

class MySaxHandler extends DefaultHandler

{

   //格式化日期格式

   static DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

   //內容

   private String content;

   //事件發生時元素中的字符

   @Override

   public void characters(char[] ch, int start, int length)

         throws SAXException {

      // TODO Auto-generated method stub

      content=new String(ch, start, length);

   }

   //當解析到元素的結束標籤時觸發

   @Override

   public void endElement(String uri, String localName, String qName)

         throws SAXException {

      // TODO Auto-generated method stub

      //如果是標題

      if("title".equals(qName))

      {

         System.out.println("標題:"+content);

      }

      //如果是作者

      else if("author".equals(qName))

      {

         System.out.println("作者:"+content);

      }

      //如果是郵件

      else if("email".equals(qName))

      {

         System.out.println("郵件:"+content);

      }

      //如果是內容

      else if("body".equals(qName))

      {

         System.out.println("內容:"+content);

      }

      //如果是日期

      else if("date".equals(qName))

      {

         System.out.println("日期:"+content);

      }

   }

   //當解析到元素的開始標籤時觸發

   @Override

   public void startElement(String uri, String localName, String qName,

         Attributes attributes) throws SAXException {

      // TODO Auto-generated method stub

      if("article".equals(qName))

      {

         //如果節點名稱爲article,則輸出article元素屬性category

         System.out.println("\r\n找到一篇文章,所屬分類:"+attributes.getValue("category")+".");

      }

   }

}

 xml代碼:

<?xml version="1.0" encoding="GB2312"?>
<articles>
<article category="Android">
<title>Android學習之路</title>
<author>徐守威</author>
<email>[email protected]</email>
<date>2016-05-20</date>
</article>
<article category="JavaWeb">
<title>JavaWeb學習筆記</title>
<author>Jasxu</author>
<email>[email protected]</email>
<date>2016-05-21</date>
</article>
</articles>

發佈了71 篇原創文章 · 獲贊 63 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章