SAX(Simple API for XML),是指一种接口,或者一个软件包。
DOM:文档驱动。DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能很差,是由于DOM的树结构所造成的,此结构占用的内存较多。
SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。
由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。
SAX解析XML步骤
①创建XML解析处理器。
②创建SAX解析器。
③将XML解析处理器分配给解析器。
④对文档进行解析,将每个事件发送给处理器。
下面是SAX解析XML文件的代码程序,完整代码下载地址:android_sax.rar
MainActivity:
[java] view plaincopy
/**
* MainActivity
*
* @author zuolongsnail
*
*/
public class MainActivity extends Activity {
private Button parseBtn;
private ListView listView;
private ArrayAdapter adapter;
private ArrayList persons;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
parseBtn = (Button) findViewById(R.id.parse);
listView = (ListView) findViewById(R.id.list);
parseBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
persons = MainActivity.this.readXml();
adapter = new ArrayAdapter<Person>(MainActivity.this,
android.R.layout.simple_expandable_list_item_1, persons);
listView.setAdapter(adapter);
}
});
}
private ArrayList<Person> readXml() {
InputStream file = this.getClass().getClassLoader()
.getResourceAsStream("persons.xml");
// ①创建XML解析处理器
SAXXmlContentHandler contentHandler = new SAXXmlContentHandler();
try {
// 创建一个SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
// ②创建SAX解析器
SAXParser parser = factory.newSAXParser();
// ③将XML解析处理器分配给解析器
// ④对文档进行解析,将每个事件发送给处理器。
parser.parse(file, contentHandler);
file.close();
} catch (Exception e) {
e.printStackTrace();
}
return contentHandler.getBooks();
}
}
XML解析处理器:
[java] view plaincopy
/**
* 解析XML处理器
* @author zuolongsnail
*
*/
public class SAXXmlContentHandler extends DefaultHandler {
private ArrayList<Person> persons;
private Person person;
private String tagName;
public ArrayList<Person> getBooks() {
return persons;
}
@Override
public void startDocument() throws SAXException {
this.persons = new ArrayList<Person>();
Log.e("SAXXmlContentHandler", "开始解析XML文件");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
Log.e("SAXXmlContentHandler", "读取标签");
this.tagName = localName;
if(this.tagName.equals("person")){
person = new Person();
person.setId(Integer.parseInt(attributes.getValue(0)));
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
Log.e("SAXXmlContentHandler", "根据tagName获取标签的内容");
if (this.tagName != null) {
String data = new String(ch, start, length);
if (this.tagName.equals("name")) {
this.person.setName(data);
} else if (this.tagName.equals("age")) {
this.person.setAge(Integer.parseInt(data));
}
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if(localName.equals("person")){
this.persons.add(person);
}
this.tagName = null;
}
}
persons.xml文件:
[xhtml] view plaincopy