使用SAX解析XML

 

SAX(Simple API for XML简称SAX)事件是无状态的,也就是说,当接收到字符数据的事件后,并不知道该字符数据是哪一个元素的

内容。同样地,当收到元素开始的事件后,也无法知道该元素是否有父元素,是否有子元素,这是

SAX和DOM不同的地方。SAX解析器本身并不提供元素的上下文信息,所有相关信息的记录需要我们自

己编程去实现

SaxXml类加载XML数据流,(目前用字符串代替),建立解析工厂,生产SAX解析对象

import java.io.ByteArrayInputStream;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class SaxXml {

private SaxXml() {
       }

SaxXml(String xmlFile) {
        try{
    String xmltest = "<?xml version=/"1.0/" encoding=/"gb2312/"?>"
      +"<home>"
      +"<name>张三</name>"
      +"<sex>男</sex>"
      +"<age>20</age>"
      +"</home>";   

      byte[] data1 = xml.getBytes();
  
      SAXParserFactory factory = SAXParserFactory.newInstance();
      factory.setValidating(true);

    SAXParser sax = factory.newSAXParser();
    sax.parse(new ByteArrayInputStream(data1), XmlHandler.handler/*new XmlHandler()*/ );
   } catch (ParserConfigurationException pce) {
    System.out.println("Could not create that parser.");
    System.out.println(pce.getMessage());
   } catch (SAXException saxe) {
    System.out.println("Problem wITh the SAX parser.");
    System.out.println(saxe.getMessage());
   } catch (Exception e) {
    e.printStackTrace();
    return ;
   }
}
}

ReadXml类定义XML解析出的数据结构,目前是一个简单容易上手的DEMO

class ReadXml {
   String name;
   String sex;
   String age;
  
   public ReadXml( ){
   }
  
   public ReadXml( String name,String sex,String age ){
    this.sex = sex;
    this.name = name;
    this.age = age;
   }
}

XmlHandler 类解析XML字符串

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.UnsupportedEncodingException;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

class XmlHandler extends DefaultHandler {
   static int READING_NAME = 1;
   static int READING_SEX = 2;
   static int READING_AGE = 3;
   static int READING_NOTHING = 0;
   int currentActivity = READING_NOTHING;
  
   public static XmlHandler handler = new XmlHandler();
  
   ReadXml xml = new ReadXml();
   XmlHandler() {
     super();
    }
/**
*<br>方法说明:当遇到开始标记时调用
*<br>输入参数:
*<br>返回类型:
*/

public void startElement(String uri, String localName, String qName, Attributes attributes)
   throws SAXException {
    if (qName.equals("name")){
      currentActivity = READING_NAME;
    }
      else if (qName.equals("sex"))
      {
      currentActivity = READING_SEX;
      }
         else if (qName.equals("age"))
         {
         currentActivity = READING_AGE;
         }
   }
/**
*<br>方法说明:当分析器遇到无法识别为标记或者指令类型字符时调用
*<br>输入参数:
*<br>返回类型:
*/

public void characters(char[] ch, int start, int length) {
   String value = new String(ch, start, length);
          if (currentActivity == READING_NAME){
     xml.name = value;
          }
    if (currentActivity == READING_SEX)
    {
     xml.sex = value;
    }
    if (currentActivity == READING_AGE)
    {
     xml.age = value;
    }
   }
/**
*<br>方法说明:当遇到节点结束时调用
*<br>输入参数:
*<br>返回类型:
*/

public void endElement(String uri, String localName, String qName) {
   if (qName.equals("home")) {
    try {
       System.out.println("/nName: "+xml.name);

       System.out.println("Sex: "+xml.sex);
        System.out.println("age: "+xml.age);
             
    } catch (UnsupportedEncodingException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
            xml = new ReadXml();
           
   }
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值