之前我們講過pull方式解析xml文件的方法了粟矿,今天我們將學(xué)習(xí)下如何通過sax方式解析xml文件胶滋。
我們需要定義一個(gè)自己的類讓其繼承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個(gè)方法都是繼承字DefaultHandler的第岖,通過方法名應(yīng)該就能猜出來其功能灸芳,當(dāng)文檔開始時(shí)調(diào)用startDocument方法益老,當(dāng)文檔結(jié)束時(shí)調(diào)用endDocument方法沿彭,當(dāng)開始一個(gè)標(biāo)簽時(shí)調(diào)用startElement方法镊尺,當(dāng)結(jié)束一個(gè)標(biāo)簽時(shí)調(diào)用endElement方法朦佩,獲取里面的內(nèi)容調(diào)用characters方法
定義了成員變量nodeName用來存放當(dāng)前的節(jié)點(diǎn)名字,id庐氮,name语稠,grade則分別存放student的id,name,garde
當(dāng)開始一個(gè)標(biāo)簽時(shí)給nodeName賦值仙畦,當(dāng)執(zhí)行到characters方法時(shí)输涕,根據(jù)nodeName里的值判斷需要執(zhí)行的操作。當(dāng)結(jié)束一個(gè)標(biāo)簽時(shí)慨畸,打印出id莱坎,name,grade里面的值寸士,同時(shí)將id檐什,name,grade清空碉京。這樣MyHandler就完成了厢汹。
接下來我們要實(shí)現(xiàn)調(diào)用的代碼了:
@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解析的內(nèi)容相容,就不多說了谐宙。
先得到一個(gè)SAXParserFactor的對(duì)象烫葬,再通過其獲得一個(gè)XMLReader對(duì)象。這時(shí)我們就需要用到MyHandler了凡蜻。
先new出MyHandler搭综,再童工reader。setContentHandler()方法將handler加入進(jìn)去划栓,再將獲取到的xml里的內(nèi)容加入進(jìn)去并讓其執(zhí)行兑巾,這樣,我們的MyHandler就可以運(yùn)行忠荞,運(yùn)行程序蒋歌,打印一下結(jié)果:
我們的程序就完成了,趕快去試試把委煤!