Sax 解析xml in java

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

  • 方法

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 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源文件和输出结果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇