sax 解析xml

本文是参考别人的写的, 地址忘了,拿人手短,提前声明一下。
解析步骤:
1.创建一个SAXParserFactory对象
SAXParserFactory factory=SAXParserFactory.newInstance();

2.获得解析器
SAXParser parser=factory.newSAXParser();

3.调用解析方法解析xml,这里的第一个参数可以传递文件、流、字符串、需要注意第二个参数(new DefaultHander)
File file=new File(“smsLog.xml”);
parser.parse(file,new DefaultHandler());
/**注解:—>这里的DefaultHandler表示
DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、
ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,
可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法,所以在这之前我们先定义一个用于实现解析
方法如下:*/

4.创建一个MyHandler类来继承DefaultHandler并重写方法
//定一个名为MyHandler类用来继承DefaultHandler
(1)MyHandler extends DefaultHander
(2)重写方法,快速记住方法(2个开始,2个结束,1一个文字(charactor–里面的内容))
(3)2个开始:StartDocment(文档的开始)StartElement(元素的开始) 2个结束:endElement(元素的结束)
endDocment(文档的结束,标志着xml文件的结束) 1个文字内容:charactor(文字内容)

5.创建一个集合把所解析的内容添加到集合
//分析:目的我们只是需要把xml里面的文字内容添加到我们的集合而不需要其他元素,所以我们需要进行判断得到
//(接上)我们需要的内容(下面会赋一个图帮助理解)

6.接步骤三 输出集合System.out.pritnln(list); 解析完成!

package com.sax.test;

import java.util.ArrayList;
import java.util.List;

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

public class MyHandler extends DefaultHandler{

    private List<SmsLog> smsLogList ;

    private SmsLog smsLog;

    private String tag;

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        //  因为这个方法只调用一次,所以在开始的时候就可以实例化集合
        smsLogList=new ArrayList<>();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        // 这个方法,只有当开始一个元素的时候才会调用,
        // 通过分析,当外部开始元素为CSubmitState的时候,需要将SmsLog实例化

        // 将tag赋值
        tag = qName;
        if ("CSubmitState".equals(qName)) {
            smsLog = new SmsLog();
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        super.endElement(uri, localName, qName);
//      这句话,必须写,因为,当sax解析完一个元素的时候,会自动认为换行符是一个字符,会继续执行 character 方法 。如果不写,就会造成没有数据的现象。 
        tag="";
//      这个方法,当到了元素结尾的时候,会调用,应该在这里,将对象添加到集合里面去。
        if ("CSubmitState".equals(qName)) {
            smsLogList.add(smsLog);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        super.characters(ch, start, length);
        // 这里是内容,但是,无法直接判断属于哪一个元素。
        String string = new String(ch, start, length);
        if ("State".equals(tag)) {// 判断当前内容,属于哪一个元素。开始赋值
            smsLog.setState(string);
        } else if ("MsgState".equals(tag)) {
            smsLog.setMsgState(string);
        } else if("MsgID".equals(tag)){
            smsLog.setMsgID(string);
        }
    }

    public List<SmsLog> getSmsLogList() {
        return smsLogList;
    }

    public void setSmsLogList(List<SmsLog> smsLogList) {
        this.smsLogList = smsLogList;
    }

    public SmsLog getSmsLog() {
        return smsLog;
    }

    public void setSmsLog(SmsLog smsLog) {
        this.smsLog = smsLog;
    }
}

上面主要的就是两个部分:
这里写图片描述

这里写图片描述
创建测试类
如果webService接口返回的是xml格式的字符串,先要转成inputstream
代码是用xml文件测试的, 注释部分可以用作webservice接口返回的xml格式的字符串

package com.sax.test;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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

import org.junit.Test;
import org.xml.sax.SAXException;

public class SaxTest {

    @Test
    public void test1(){
//      1.创建对象
        SAXParserFactory newInstance = SAXParserFactory.newInstance();
        try {
//      2.获取解析器 
            SAXParser saxParser = newInstance.newSAXParser();
//      3.调用方法开始解析xml   
            File file = new File("smsLog.xml");
            MyHandler dh = new MyHandler();
            saxParser.parse(file, dh);
//            String file = "<?xml version=\"1.0\" encoding=\"utf-8\"?> <CSubmitState xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://tempuri.org/\"><State>0</State> <MsgID>1707161455143517111</MsgID> <MsgState>提交成功</MsgState> <Reserve>1</Reserve></CSubmitState>";
//            InputStream is =new ByteArrayInputStream(file.getBytes());
//            saxParser.parse(is, dh);
            List<SmsLog> smsLog=dh.getSmsLogList();
            String msgId = smsLog.get(0).getMsgID();
            String msgState = smsLog.get(0).getMsgState();

//      4.输出集合
            System.out.println("msgId = "+msgId);
            System.out.println("msgState = "+msgState);
        } catch (ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

下面是我的xml文件以及实体类
这里写图片描述
“`
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值