Android中解析XML(SAX方式)Demo
2012-03-29 02:27
453 查看
在Android开发中需要解析XML,那么如何解析XML文件呢?
Android参考API中提供了多种方式解析XML,其中之一就是SAX方式。
下面是本人写的一个小Demo.
工程目录如下图所示
需要解析的XML文件如下:
// textxml.xml
// 定义User类
// 定义自己的解析XML工具类,继承自DefaultHandler
// 主程序如下:Main.java
// 运行结果如下:
Android参考API中提供了多种方式解析XML,其中之一就是SAX方式。
下面是本人写的一个小Demo.
工程目录如下图所示
需要解析的XML文件如下:
// textxml.xml
<?xml version="1.0" encoding="UTF-8"?> <users> <user id="01"> <username>Lucas Cheng</username> <password>1234</password> </user> <user id="02"> <username>David John</username> <password>6789</password> </user> </users>
// 定义User类
package xxx.xxx.xxx; public class User { private String id; private String name; private String pwd; public String getId() { return id; } public String getName() { return name; } public String getPwd() { return pwd; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setPwd(String pwd) { this.pwd = pwd; } /** 打印出User信息 */ @Override public String toString() { return "ID: \t" + getId() + "\nName : \t" + getName() + "\nPwd :\t" + getPwd() + "\n"; } }
// 定义自己的解析XML工具类,继承自DefaultHandler
package xxx.xxx.xxx; 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 android.util.Log; public class MyHandler extends DefaultHandler { private final String TAG = "MyHander"; // 定义XML的标签及标签属性名称 public final String ELE_ROOT = "users"; public final String ELE_USER = "user"; public final String ATTR_USER_ID = "id"; public final String ELE_NAME = "username"; public final String ELE_PWD = "password"; // 定义临时变量 private User user = null; private StringBuilder text = new StringBuilder(); // 定义变量保存解析结果 public List<User> userList = null; // 重写父类的以下方法定义自己的解析方式 @Override public void startDocument() throws SAXException { Log.d(TAG, "Start document..."); super.startDocument(); } @Override public void endDocument() throws SAXException { super.endDocument(); Log.d(TAG, "End document..."); } /** 开始解析一个标签时触发 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (localName.equalsIgnoreCase(ELE_ROOT)) {// 根元素 // 初始化返回User列表 if (null == userList) { userList = new ArrayList<User>(); } else { userList.clear(); } } else if (localName.equalsIgnoreCase(ELE_USER)) { // new一个User对象,并赋给Id值 user = new User(); user.setId(attributes.getValue(ATTR_USER_ID)); } else if (localName.equalsIgnoreCase(ELE_NAME)) { // 等待该标签结束时设置内容给user } else if (localName.equalsIgnoreCase(ELE_PWD)) { // 等待该标签结束时设置内容给user } else { // Nothing to do ... } } /** 解析标签中内容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // 将标签中内容保存到临时字符串中 text.setLength(0); text.append(String.valueOf(ch, start, length)); } /** 结束解析一个标签时触发 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (localName.equalsIgnoreCase(ELE_ROOT)) {// 根元素 // nothing ... } else if (localName.equalsIgnoreCase(ELE_USER)) { userList.add(user);// user加入列表 } else if (localName.equalsIgnoreCase(ELE_NAME)) { user.setName(text.toString());// 给user设置name } else if (localName.equalsIgnoreCase(ELE_PWD)) { user.setPwd(text.toString());// 给user设置pwd } else { // Nothing to do ... } } }
// 主程序如下:Main.java
package xxx.xxx.xxx; import java.io.InputStream; import java.util.List; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import xxx.xxx.xxx.R; import android.app.Activity; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.view.View; import android.widget.TextView; public class Main extends Activity { private TextView textResult = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textResult = (TextView) findViewById(R.id.txt_result); textResult.setMovementMethod(ScrollingMovementMethod.getInstance()); findViewById(R.id.btn_parse).setOnClickListener( new View.OnClickListener() { public void onClick(View v) { if (null != textResult) textResult.setText(parseXML()); } }); findViewById(R.id.btn_clear).setOnClickListener( new View.OnClickListener() { public void onClick(View v) { if (null != textResult) textResult.setText(""); } }); } protected CharSequence parseXML() { MyHandler handler = new MyHandler(); try { // 取得XMLReader实例 XMLReader xr = SAXParserFactory.newInstance().newSAXParser() .getXMLReader(); // 为XMLReader设置处理器 xr.setContentHandler(handler); // 构建XML输入流 InputSource input = null; InputStream stream = getApplication().getAssets().open( "testxml.xml"); input = new InputSource(stream); // 解析XML xr.parse(input); } catch (Exception e) { e.printStackTrace(); } List<User> users = handler.userList; StringBuilder sb = new StringBuilder(); if (null != users) { for (User u : users) { sb.append(u.toString()).append("\n"); } } return sb; } }
// 运行结果如下:
相关文章推荐
- :Android网络编程--XML之解析方式:SAX
- Android三种解析XML方式(SAX,DOM,PULL)
- Android 创建与解析XML(三)—— Sax方式
- Android网络之数据解析----SAX方式解析XML数据
- XML---android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android网络之数据解析----SAX方式解析XML数据
- Android SAX 解析XML的Demo
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- Android解析Xml的三种方式:DOM、SAX以及XMLPull
- (五十七)android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结-SAX、Pull、Dom三种方式
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android 创建与解析XML(三)—— Sax方式
- [Android]四种方式解析字符串----JSON、SAX、DOM、XML
- Android 创建与解析XML(三)—— Sax方式
- Android解析XML三种方式(PULL、SAX、DOM)
- android中解析XML文件方式—DOM SAX PULL
- android解析XML总结(SAX、Pull、Dom三种方式)