天天看點

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

我們的程式就完成了,趕快去試試把!