基于事件驱动的解析方式,不像DOM解析一样把整个文档放入内存中。
实现将xml文档解析并放入list集合中:
1、此处在assets文件夹中创建xml文件,eg:
movie.xml
<span style="font-size:18px;"><root>
<value>
<type_en>navigation</type_en>
<type_ch>导航</type_ch>
<count>3</count>
</value>
<value>
<type_en>synch_theatre</type_en>
<type_ch>同步剧场</type_ch>
<count>6</count>
</value>
<value>
<type_en>hot_film</type_en>
<type_ch>热播电影</type_ch>
<count>6</count>
</value>
<value>
<type_en>vip_film</type_en>
<type_ch>会员电影</type_ch>
<count>6</count>
</value>
<value>
<type_en>animation</type_en>
<type_ch>动画片</type_ch>
<count>6</count>
</value>
</root></span>
<pre name="code" class="html"><span style="font-size:18px;"><strong>//xml对应的bean类。</strong></span>
<span style="font-size:18px;">public class MovieXMLBean {
String type_en;
String type_ch;
String count;
public String getType_en() {
return type_en;
}
public void setType_en(String type_en) {
this.type_en = type_en;
}
public String getType_ch() {
return type_ch;
}
public void setType_ch(String type_ch) {
this.type_ch = type_ch;
}
public String getCount() {
return count;
}
public void setCount(String count) {
this.count = count;
}
}</span>
2、SAXParser 的初始化
// An instance of this class can be obtained from the javax.xml.parsers.SAXParserFactory.newSAXParser()
method.
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
3、需要一个File
InputStream is = getContext().getAssets().open("movie.xml");
4、解析并注册监听类
saxParser.parse(is, new MyHandler());//MyHandler为自定义,在5中有解释
5、自定义,用于监听事件
<span style="font-size:18px;">class MyHandler extends DefaultHandler {
String str;//保存起始元素名称
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
str = localName;
super.startElement(uri, localName, qName, attributes);
}
<span style="white-space:pre"> </span>//注意1、ch一块字符串内存,每次解析完成将结果放入ch中,start为起始位置,length为结果的长度,而非ch长度</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>//注意2、<span style="font-family:Arial, Helvetica, sans-serif;">前一个元素跟下一个元素之间如果存在内容仍然会调用。如:</one> 123 <two> ,123会被存入ch中。</span>
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (TextUtils.isEmpty(str)) {
return;
}
String chars = new String(ch, start, length);
if (xmlBean == null) {
xmlBean = new MovieXMLBean();
}
switch (str) {
case "type_en":
xmlBean.setType_en(chars);
break;
case "type_ch":
xmlBean.setType_ch(chars);
break;
case "count":
xmlBean.setCount(chars);
break;
default:
break;
}
super.characters(ch, start, length);
}
<span style="white-space:pre"> </span>//元素结束时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (!TextUtils.isEmpty(str) && str.equals("count")) {
if (lists == null) {
lists = new ArrayList<MovieXMLBean>();
}
lists.add(xmlBean);
xmlBean = new MovieXMLBean();
}
str = null;
super.endElement(uri, localName, qName);
}
<span style="white-space:pre"> </span>//解析文档结束时调用
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span><span style="color:#ff0000;">总结:通过以上步骤能简单实现对xml文档解析,并存放到list集合中。</span></span>