本文是参考别人的写的, 地址忘了,拿人手短,提前声明一下。
解析步骤:
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文件以及实体类
“`