之前我们讲过pull方式解析xml文件的方法了,今天我们将学习下如何通过sax方式解析xml文件。
我们需要定义一个自己的类让其继承DefaultHandler
private class MyHandler extends DefaultHandler{
private String nodeName=null;
private StringBuilder id=null,name=null,grade=null;
@Override
public void startDocument() throws SAXException {
super.startDocument();
id=new StringBuilder();
name=new StringBuilder();
grade=new StringBuilder();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
nodeName=localName;
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (localName.equals("student")){
String a=id.toString().trim();
String b=name.toString().trim();
String c=grade.toString().trim();
Log.d("result",a+" -- "+b+" -- "+c);
id.setLength(0);
name.setLength(0);
grade.setLength(0);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if(nodeName.equals("id")){
id.append(ch,start,length);
}else if(nodeName.equals("name")){
name.append(ch,start,length);
}else if(nodeName.equals("grade")){
grade.append(ch,start,length);
}
}
MyHolder里的5个方法都是继承字DefaultHandler的,通过方法名应该就能猜出来其功能,当文档开始时调用startDocument方法,当文档结束时调用endDocument方法,当开始一个标签时调用startElement方法,当结束一个标签时调用endElement方法,获取里面的内容调用characters方法
定义了成员变量nodeName用来存放当前的节点名字,id,name,grade则分别存放student的id,name,garde
当开始一个标签时给nodeName赋值,当执行到characters方法时,根据nodeName里的值判断需要执行的操作。当结束一个标签时,打印出id,name,grade里面的值,同时将id,name,grade清空。这样MyHandler就完成了。
接下来我们要实现调用的代码了:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sax);
Log.d("result","id -- name -- grade");
new Thread(new Runnable() {
@Override
public void run() {
f1();
}
}).start();
}
private void f1() {
try {OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url("http://*.*.*.*:*/testPull.xml").build();
Response response=client.newCall(request).execute();
String s=response.body().string();
f2(s);
} catch (IOException e) {
e.printStackTrace();
}
}
private void f2(String s) {
try {
SAXParserFactory factor=SAXParserFactory.newInstance();
XMLReader reader=factor.newSAXParser().getXMLReader();
MyHandler handler=new MyHandler();
reader.setContentHandler(handler);
reader.parse(new InputSource(new StringReader(s)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
f1()方法与pull解析的内容相容,就不多说了。
先得到一个SAXParserFactor的对象,再通过其获得一个XMLReader对象。这时我们就需要用到MyHandler了。
先new出MyHandler,再童工reader。setContentHandler()方法将handler加入进去,再将获取到的xml里的内容加入进去并让其执行,这样,我们的MyHandler就可以运行,运行程序,打印一下结果:
我们的程序就完成了,赶快去试试把!