Android下支持几种方式解析xml文件。其中SAX(Simple API for XML)由于解析速度快(文本形式解析)、占用内存少(不用将文件全部载入内存,行扫描)等优点,在需要对XML仅进行读操作、XML文件较大等情况下使用较多。本文将着重介绍SAX。
首先我们提供一个测试xml文件(摘自我们工作中抓取的服务器交互文件信息):
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<LoginResp>
<TimeStamp>20110519173529</TimeStamp>
<UserToken>cc2d545418a32d46a6cd4376bc868bc3</UserToken>
<ContentList>
<Content>
<ContentID>20000000000000000000000000097747</ContentID>
<Sequence>363452190</Sequence>
<Name>首页</Name>
</Content>
<Content>
<ContentID>20000000000000000000000000097748</ContentID>
<Sequence>363452192</Sequence>
<Name>频道</Name>
</Content>
<Content>
<ContentID>20000000000000000000000000067251</ContentID>
<Sequence>363452193</Sequence>
<Name>直播</Name>
</Content>
<Content>
<ContentID>20000000000000000000000000097806</ContentID>
<Sequence>363452195</Sequence>
<Name>特色包</Name>
</Content>
<Content>
<ContentID>20000000000000000000000000097750</ContentID>
<Sequence>363452197</Sequence>
<Name>搜索</Name>
</Content>
</ContentList>
<ContentCount>5</ContentCount>
<ResultCode>0</ResultCode>
<ResultDesc>成功</ResultDesc>
</LoginResp>
使用adb push将文件push到手机内存中。
编写一个实体类:
Content.java
package com.freesoft.anttest;
public class Content {
public static String ITEM = "Content";
public static String CONTENTID_NAME = "ContentID";
public static String SEQUENCE_NAME = "Sequence";
private String ContentID;
private int Sequence;
public String getContentID() {
return ContentID;
}
public void setContentID(String contentID) {
ContentID = contentID;
}
public int getSequence() {
return Sequence;
}
public void setSequence(int sequence) {
Sequence = sequence;
}
}
编写一个解析类:
SAXXmlHandler.java
注意需要重载几个重要事件方法:
- startDocument:开始读取文档内容时。用于初始化变量;
- startElement:开始读取节点时。用于增加节点变量、清空文本缓冲区;
- endElement:节点读取结束时。用于修改节点内容、将节点插入到队列中;
package com.freesoft.utility;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.freesoft.anttest.Content;
public class SAXXmlHandler extends DefaultHandler {
private static String TAG = "SAXXmlHandler";
private List<Content> contents;
private Content currentContent;
private StringBuilder builder;
public List<Content> getContents() {
return contents;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
// 读取字符串内容到缓冲区中
builder.append(ch, start, length);
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
if (currentContent != null) {
if (localName.equals(Content.CONTENTID_NAME)) {
String strid = builder.toString();
currentContent.setContentID(strid);
}
else if (localName.equals(Content.SEQUENCE_NAME))
currentContent.setSequence(IntWrapper.wrap(builder.toString(),
0));
else if (localName.equals(Content.ITEM))
contents.add(currentContent);
builder.setLength(0);
}
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
contents = new ArrayList<Content>();
builder = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (localName.equals(Content.ITEM)) {
currentContent = new Content();
}
builder.setLength(0);
}
}
编写一个用来展现的Activity:
XmlSAXActivity.java
package com.freesoft.anttest;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import com.freesoft.utility.SAXXmlHandler;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class XmlSAXActivity extends Activity {
private TextView tvView = null;
private Button btnParse = null;
private Button btnView = null;
private SAXXmlHandler xmlhandle = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xmlsax);
getControls();
initControls();
}
private void initControls() {
btnParse.setOnClickListener(new BtnParse_onclick());
btnView.setOnClickListener(new BtnView_onclick());
}
private void getControls() {
tvView = (TextView) findViewById(R.id.tv_sax_view);
btnParse = (Button) findViewById(R.id.btn_sax_parse);
btnView = (Button) findViewById(R.id.btn_sax_view);
}
class BtnParse_onclick implements OnClickListener {
@Override
public void onClick(View arg0) {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser;
try {
parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
URL url;
InputSource is;
url = new URL("file:///sdcard/welcome.xml");
is = new InputSource(url.openStream());
xmlhandle = new SAXXmlHandler();
xmlreader.setContentHandler(xmlhandle);
xmlreader.parse(is);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
}
}
class BtnView_onclick implements OnClickListener {
@Override
public void onClick(View arg0) {
tvView.setText("");
List<Content> contents = xmlhandle.getContents();
Iterator i = contents.iterator();
String outstr = "";
while (i.hasNext()){
Content content = (Content) i.next();
String id = content.getContentID();
int sequence = content.getSequence();
outstr = outstr + "ContentID: " + id + "\n" + "Sequence: " +sequence + "\n";
}
tvView.setText(outstr);
}
}
}
这里需要注意:
- 首先得到一个SAXParserFactory的实例;
- 通过工厂创建一个parser对象;
- 通过parser对象得到一个XMLReader;
- 将xmlreader与新创建的xmlhandler关联起来,这样开始文件解析时相应事件会及时抛出;
本文详细介绍了在Android环境下使用SAX方法解析XML文件的过程,包括提供测试xml文件、实体类定义、解析类实现及展示Activity的编写。重点突出SAX解析方式的特点与应用,特别适用于大文件读取场景。
4083

被折叠的 条评论
为什么被折叠?



