SAX解析XML文件
src下wp.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23"> <name>张三</name> <age>20</age> </person> <person id="20"> <name>小明</name> <age>26</age> </person> </persons>
org.wp.domain
Person
package org.wp.domain;
public class Person {
private Integer id;
private String name;
private Short age;
public Person() {
}
public Person(String name, Short age) {
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
@Override
public String toString() {
return "Id=" + id + ",Name=" + name + ",Age=" + age;
}
}
org.wp.service
SAXPersonService
package org.wp.service;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.wp.domain.Person;
public class SAXPersonService {
public static List<Person> readXml(InputStream inStream) throws Exception {
// 得到SAX解析器的工厂实例
SAXParserFactory spf = SAXParserFactory.newInstance();
// 从SAX工厂实例中获得SAX解析器
SAXParser saxParser = spf.newSAXParser();
// 设置解析器的相关特性,http://xml.org/sax/features/namespaces = true
// 表示开启命名空间特性
// saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
XMLContentHandler handler = new XMLContentHandler();
saxParser.parse(inStream, handler);
inStream.close();
return handler.getPersons();
}
}
XMLContentHandler
package org.wp.service;
import java.util.ArrayList;
import java.util.List;
import org.wp.domain.Person;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons;
private Person person;
private String preTAG;
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (person != null) {
String data = new String(ch, start, length);
if ("name".equals(preTAG)) {
person.setName(data);
} else if ("age".equals(preTAG)) {
person.setAge(new Short(data));
}
}
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("person".equals(localName)) {
person = new Person();
person.setId(new Integer(attributes.getValue(0)));
}
preTAG = localName;
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("person".equals(localName) && person != null) {
persons.add(person);
person = null;
}
preTAG = null;
}
public List<Person> getPersons() {
return persons;
}
}
org.wp.xml
SAXPersonServiceTest
package org.wp.xml;
import java.io.InputStream;
import java.util.List;
import org.wp.domain.Person;
import org.wp.service.SAXPersonService;
import android.test.AndroidTestCase;
import android.util.Log;
/**
* Java中的getResourceAsStream有以下几种
*
* 1. Class.getResourceAsStream(String path)
* path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取
* 其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源
*
* 2. Class.getClassLoader.getResourceAsStream(String path)
* 默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源
*
* @author wp
*
*/
public class SAXPersonServiceTest extends AndroidTestCase {
private static final String TAG = "SAXPersonServiceTest";
public void testReadXml() throws Exception {
InputStream inStream = SAXPersonServiceTest.class.getClassLoader()
.getResourceAsStream("wp.xml");
List<Person> persons = SAXPersonService.readXml(inStream);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}
}
XMLActivity
package org.wp.xml;
import java.io.InputStream;
import java.util.List;
import org.wp.domain.Person;
import org.wp.service.SAXPersonService;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class XMLActivity extends Activity {
private static final String TAG = "XMLActivity";
private TextView resultView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
resultView = (TextView) findViewById(R.id.result);
InputStream inStream = XMLActivity.class.getClassLoader()
.getResourceAsStream("wp.xml");
try {
List<Person> persons = SAXPersonService.readXml(inStream);
StringBuilder sb = new StringBuilder();
for (Person person : persons) {
sb.append(person.toString()).append("\n");
}
resultView.setText(sb.toString());
} catch (Exception e) {
Log.e(TAG, e.toString());
Toast.makeText(this, "xml解析失败", 1).show();
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/result" /> </LinearLayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, XMLActivity!</string> <string name="app_name">xml解析器</string> </resources>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.wp.xml" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="android.test.runner" /> <activity android:name=".XMLActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="7" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="org.wp.xml" android:label="Tests for My App" /> </manifest>
本文介绍了一种使用SAX解析器处理XML文件的方法,并提供了一个具体的实现案例。该案例包括了定义XML文件结构、创建对应的Java实体类、实现SAX解析逻辑及在Android环境中进行测试的过程。
1万+

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



