代码中,我们定义了自己的事件处理逻辑,重写了DefaultHandler的几个重要的事件方法。下面我为大家着重介绍一下DefaultHandler的相关知识。DefaultHandler是一个事件处理器,可以接收解析器报告的所有事件,处理所发现的数据。它实现了EntityResolver接口、DTDHandler接口、ErrorHandler接口和ContentHandler接口。这几个接口代表不同类型的事件处理器。我们着重介绍一下ContentHandler接口。结构如图:
这几个比较重要的方法已被我用红线标注,DefaultHandler实现了这些方法,但在方法体内没有做任何事情,因此我们在使用时必须覆写相关的方法。最重要的是startElement方法、characters方法和endElement方法。当执行文档时遇到起始节点,startElement方法将会被调用,我们可以获取起始节点相关信息;然后characters方法被调用,我们可以获取节点内的文本信息;最后endElement方法被调用,我们可以做收尾的相关操作。
最后,我们需要调用SAX解析程序,这个步骤在MainActivity中完成:
package com.scott.xml;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.scott.xml.model.Book;
import com.scott.xml.parser.BookParser;
import com.scott.xml.parser.SaxBookParser;
public class MainActivity extends Activity {
private static final String TAG = "XML";
private BookParser parser;
private List<Book> books;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button readBtn = (Button) findViewById(R.id.readBtn);
Button writeBtn = (Button) findViewById(R.id.writeBtn);
readBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
InputStream is = getAssets().open("books.xml");
parser = new SaxBookParser(); //创建SaxBookParser实例
books = parser.parse(is); //解析输入流
for (Book book : books) {
Log.i(TAG, book.toString());
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
});
writeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
String xml = parser.serialize(books); //序列化
FileOutputStream fos = openFileOutput("books.xml", Context.MODE_PRIVATE);
fos.write(xml.getBytes("UTF-8"));
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
});
}
}











