SAX是一种以事件为驱动的XML API,特点是 解析速度快、占用内存少,适用于Android等CPU、内存资源宝贵的移动设备。SAX被认为是处理XML最有效的标准方法。
record.xml
<?xml version="1.0" encoding="UTF-8"?>
<record>
<study id="1">
<topic>SAX Parser</topic>
<content>parse XML using SAXParser</content>
<author>Pete Houston</author>
<date>02-Oct-2011</date>
</study>
</record>
下面以日志形式打印出了SAX解析record.xml的整个过程:
创建一个名为SAXParser的项目
1.针对从XMl中需要获得的信息,新建一个Study类。
package com.example.data;
public class Study {
public int mId;
public String mTopic;
public String mContent;
public String mAuthor;
public String mDate;
public static final String STUDY = "study";
public static final String ID = "id";
public static final String TOPIC = "topic";
public static final String CONTENT = "content";
public static final String AUTHOR = "author";
public static final String DATE = "date";
}
2.新建一个类继承自DefaultHandler,而DefaultHandler是实现了ContentHandler的接口。ContentHandler提供了解析xml所需要的各个方法。
public class StudyHandler extends DefaultHandler {
private static final String TAG = "StudyHandler";
// 成员变量
private boolean isTopic;
private boolean isContent;
private boolean isAuthor;
private boolean isDate;
// 记录当前要解析的Study
private Study mStudy;
public Study getStudy() {
return mStudy;
}
// 在此事件中进行初始化
@Override
public void startDocument() throws SAXException {
Log.d(TAG,"***startDocument()***");
mStudy = new Study();
}
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
throws SAXException {
Log.d(TAG,"***startElement()***");
if(localName.equals(Study.STUDY)) {
mStudy.mId = Integer.parseInt(atts.getValue(Study.ID));
Log.d(TAG,"attributeName:"+atts.getLocalName(0)+" attributeValue:"+atts.getValue(0));
}else if(localName.equals(Study.TOPIC)) {
isTopic = true;
}else if(localName.equals(Study.CONTENT)) {
isContent = true;
}else if(localName.equals(Study.AUTHOR)) {
isAuthor = true;
}else if(localName.equals(Study.DATE)) {
isDate = true;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
Log.d(TAG,"***endElement()***");
if(localName.equals(Study.TOPIC)) {
isTopic = false;
}else if(localName.equals(Study.CONTENT)) {
isContent = false;
}else if(localName.equals(Study.AUTHOR)) {
isAuthor = false;
}else if(localName.equals(Study.DATE)) {
isDate = false;
}
}
@Override
public void characters(char ch[], int start, int length) {
String chars = new String(ch, start, length);
chars = chars.trim(); // 避免读取到的XML有空格,造成格式混乱
if(!"".equals(chars.trim())){
Log.d(TAG, "content:"+chars);
}
if(isTopic) mStudy.mTopic = chars;
else if(isContent) mStudy.mContent = chars;
else if(isAuthor) mStudy.mAuthor = chars;
else if(isDate) mStudy.mDate = chars;
}
@Override
public void endDocument() throws SAXException {
Log.d(TAG,"***endDocument()***");
}
}
3.新建一个工具类处理所有的解析事务
public class StudyParser {
public static Study parse(InputStream is) {
Study study = null;
try {
// 从SAXParser中得到XMLReader
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
StudyHandler studyHandler = new StudyHandler();
xmlReader.setContentHandler(studyHandler);
xmlReader.parse(new InputSource(is));
study = studyHandler.getStudy();
} catch(Exception ex) {
Log.d("XML", "StudyParser: parse() failed");
}
return study;
}
}
4.MainActivity.java
public class MainActivity extends Activity {
private TextView tv_id;
private TextView tv_topic;
private TextView tv_content;
private TextView tv_author;
private TextView tv_date;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_id = (TextView)findViewById(R.id.tv_id);
tv_topic = (TextView)findViewById(R.id.tv_topic);
tv_content = (TextView)findViewById(R.id.tv_content);
tv_author = (TextView)findViewById(R.id.tv_author);
tv_date = (TextView)findViewById(R.id.tv_date);
Study study = null;
try {
study = StudyParser.parse(getAssets().open("record.xml"));
tv_id.setText(study.mId+"");
tv_topic.setText(study.mTopic);
tv_content.setText(study.mContent);
tv_author.setText(study.mAuthor);
tv_date.setText(study.mDate);
} catch (IOException e) {
Log.d("XML","onCreate(): parse() failed");
return;
}
}
}
运行截图: