之前我們講過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就可以運作,運作程式,列印一下結果:
image.png
我們的程式就完成了,趕快去試試把!