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>shouweixu@foxmail.com</email>
<date>2016-05-20</date>
</article>
<article category="JavaWeb">
<title>JavaWeb学习笔记</title>
<author>Jasxu</author>
<email>shouweixu@qq.com</email>
<date>2016-05-21</date>
</article>
</articles>

posted @ 2016-05-21 13:57  徐守威  阅读(351)  评论(0编辑  收藏  举报