Sax 解析xml in java

5 篇文章 0 订阅

Sax 解析xml

SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。

SAX是一种XML解析的替代方法。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。

基于事件的API

SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。
JDK中org.xml.sax.helpers.DefaultHandler 是SAX2 事件处理器的默认基类

  • DefaultHander

    DefaultHander

  • 方法

    方法

Java中Sax解析xml

目录结构

1.SaxHandler.java

package com.kanbujian.handler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

//org.xml.sax.helpers.DefaultHandler
//别导错包
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;




/**
 * SAX处理类 繼承 DefaultHandler ,Default base class for SAX2 event handlers
 * 基于事件,触发方法
 * 
 * @author QT
 * 
 */
public class SaxHandler extends DefaultHandler {
    /**
     * map 保存一个xml元素的属性名和值
     */
    private HashMap<String, String> map = null;
    /**
     * list 保存所有xml元素
     */
    private ArrayList<HashMap<String, String>> list = null;
    /**
     * 扫描的节点的标记
     */
    private String CurrentTag = null;
    /**
     * 扫描到的节点的值
     */
    private String CurrentValue = null;
    /**
     * 扫描到的节点的名字
     */
    private String NodeName = null;

    /**
     * 构造方法
     * 
     * @param nodeName 解析的节点名称
     *            
     */
    public SaxHandler(String nodeName) {
        super();
        NodeName = nodeName;
    }

    /**
     * 返回xml元素的List集合
     * 
     * @return xml元素的List集合
     */
    public ArrayList<HashMap<String, String>> getList() {
        return list;
    }

    /**
     * 当读取到文檔时,触发这个方法
     */
    @Override
    public void startDocument() throws SAXException {
        list = new ArrayList<HashMap<String, String>>();

    }

    /**
     * 當讀取到第一個標簽時,觸發這個方法
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if (qName.equals(NodeName)) {
            map = new HashMap<String, String>();
        }
        if (attributes != null && map != null) {
            for (int i = 0; i < attributes.getLength(); i++) {
                map.put(attributes.getQName(i), attributes.getValue(i));
            }
        }
        CurrentTag = qName;
    }

    /**
     * 处理xml文件的内容
     */
    @Override
    public void characters(char[] ch, int start, int lengh) throws SAXException {
        if (CurrentTag != null && map != null) {
            CurrentValue = new String(ch, start, lengh);
            if (CurrentValue != null & !CurrentValue.trim().equals("")
                    && !CurrentValue.trim().equals("\n")) {
                map.put(CurrentTag, CurrentValue);
            }
        }
        CurrentTag = null;
        CurrentValue = null;
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equals(NodeName)) {
            list.add(map);
            map = null;
        }
    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        super.endDocument();
    }

}

2.HttpUtils.java

package com.kanbujian.http;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
 * http工具類
 * @author QT
 *
 */
public class HttpUtils {
    public HttpUtils() {
        // TODO Auto-generated constructor stub
    }
    /**
     * 通過URL獲取輸入流
     * @param path
     * @return
     */
    public static InputStream getXml(String path){
        InputStream is=null;
     try {
        URL url=new URL(path);
        if(url!=null){
            //獲得HttpURLConnnection
            HttpURLConnection connection =(HttpURLConnection)url.openConnection();
            //設置屬性
            connection.setConnectTimeout(3000);
            connection.setDoInput(true);
            connection.setRequestMethod("GET");
            int code=connection.getResponseCode();
            //GET請求成功
            if(code==200){
                is=connection.getInputStream();
            }
        }

    } catch (Exception e) {
        // TODO: handle exception
    }
     return is;

    }
}

3.xmlService.java

package com.kanbujian.xmlservice;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

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




import com.kanbujian.handler.SaxHandler;
/**
 * service類
 * 通過readXML靜態方法實現讀取xml的功能 * 
 * @author QT
 *
 */
public class xmlService {
    /**
     * readXML()靜態方法
     * @param io 輸入流
     * @param nodeName 節點名
     * @return  所有節點元素組成的集合
     */
   public static ArrayList<HashMap<String, String>> readXML(InputStream io,String nodeName) {

       List<HashMap<String, String>> list=null;
       try {
          //得到转换工厂
         SAXParserFactory saxFactory=SAXParserFactory.newInstance();
         //得到解析器
         SAXParser parser=saxFactory.newSAXParser();

         SaxHandler handler=new SaxHandler(nodeName);
         //SAX解析
         parser.parse(io, handler);
         //記得關閉流
         io.close();

         return handler.getList();
    } catch (Exception e) {
        // TODO: handle exception
    }
       return null;


}
}

4.text.java

package com.kanbujian.text;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import com.kanbujian.http.HttpUtils;
import com.kanbujian.xmlservice.xmlService;

public class text {
  public static void main(String[] args){
      String path="http://localhost:8080/jay01/user.xml";
      InputStream is=HttpUtils.getXml(path);
      try {
          ArrayList<HashMap<String, String>> list=xmlService.readXML(is, "user");
          for(HashMap<String, String> hm:list){
              System.out.println(hm);
          }
    } catch (Exception e) {
        // TODO: handle exception
    }
  }
}

5.XML源文件和输出结果

输出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值