天天看点

android中sax解析xml,Android SAX方式解析xml文件

之前我们讲过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就可以运行,运行程序,打印一下结果:

android中sax解析xml,Android SAX方式解析xml文件

image.png

我们的程序就完成了,赶快去试试把!