在編寫解析代碼的時候發現,我在這方面掌握的還不夠紮實。
出現的問題是,在一個元素中“<item></item>”,裏面的數據總是得不到,經過測試發現,
public void characters(char[] ch, int start, int length)
執行了兩次。
具體描述如下:
由於第二次得到的都是空值,所以我得不到數據。
解決的辦法是添加一個判斷,一個布爾變量。在元素開始和結束的時候,設定布爾值。
public class MySaxParseHandler extends DefaultHandler {
APN apn;
boolean flag = true;
String string;
public MySaxParseHandler(APN apn) {
this.apn = apn;
}
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("文檔解析開始");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("文檔解析結束");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
System.out.println("元素開始" + localName);
flag = true;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("元素結束" + localName);
flag = false;
if ("name".equals(localName)) {
apn.setName(string);
} else if ("apn".equals(localName)) {
apn.setApn(string);
} else if ("mcc".equals(localName)) {
apn.setMcc(string);
} else if ("mnc".equals(localName)) {
apn.setMnc(string);
} else if ("numeric".equals(localName)) {
apn.setNumeric(string);
} else if ("proxy".equals(localName)) {
apn.setProxy(string);
} else if ("port".equals(localName)) {
apn.setPort(string);
} else if ("mmsproxy".equals(localName)) {
apn.setMmsproxy(string);
} else if ("mmsport".equals(localName)) {
apn.setMmsport(string);
} else if ("insert_by".equals(localName)) {
apn.setInsert_by(string);
} else if ("authtype".equals(localName)) {
apn.setAuthtype(string);
} else if ("current".equals(localName)) {
apn.setCurrent(string);
} else if ("type".equals(localName)) {
apn.setType(string);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
if (flag) {
string = new String(ch, start, length);
}
}
}
數據模型
public class APN {
String name;
String apn;
String mcc;
String mnc;
String numeric;
String user;
String password;
String server;
String proxy;
String port;
String mmsport;
String mmsproxy;
String mmsprotocol;
String mmsc;
String insert_by;
String authtype;
String current;
String type;
public String getName() {
return name;
}
public void setName(String name) {
System.out.println(name);
this.name = name;
}
//---很多的getter和setter,省去了。
}
外部調用事例,(拋異常)
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader;
reader = factory.newSAXParser().getXMLReader();
MySaxParseHandler handler = new MySaxParseHandler(apn);
reader.setContentHandler(handler);
reader.parse(new InputSource(getResources().openRawResource(R.raw.apn)));
System.out.println(apn.toString());