SAX 解析 XML
发布时间:2020-12-16 09:31:58 所属栏目:百科 来源:网络整理
导读:SAX是一种以事件为驱动的 XML API,其定义的事件流可以指定从解析器传到专门的处理程序代码的XML结构。 【优点】:解析速度快、占用内存少。特别适用于Android等移动设备。 使用步骤: ①:针对从XML中获取到的信息,需对其建立一个对象(例:Person),存放相
|
SAX是一种以事件为驱动的 XML API,其定义的事件流可以指定从解析器传到专门的处理程序代码的XML结构。
【优点】:解析速度快、占用内存少。特别适用于Android等移动设备。 使用步骤: ①:针对从XML中获取到的信息,需对其建立一个对象(例:Person),存放相关信息 ②:新建一个类继承至DefaultHandler(DefaultHandler是已经实现了ContentHandler的接口),提供了相应的方法。 复写以下方法处理:startDocument(); startElement(String uri,String localName,String qName,Attributes attributes); characters(char[] ch,int start,int length); endElement(String uri,String qName); endDocument(); [方法中参数解释]示例:<newii:will> uri: 命名空间,示例中的newii localName: 标签名称,示例中的will qName: 带命名空间的标签名,示例中的newii:will attributes: 存放该标签的所有属性 ch: 当前读取到的TextNode字节数组 start: 字节开始位置 length: 当前TextNode长度 ③:测试需要,建立一个person.xml文件,内容如下: <?xml version="1.0" encoding="UTF-8" ?> <persons> <person id="23"> <name>Test</name> <age>21</age> </person> </persons> ④:在应用中通过 InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml"); 加载需要解析的文件,并通过一个SAXParserFactory来创建具体的SAXParser 解析XML有两种形式,需要创建一个XMLReader或直接使用SAXParser 使用XMLReader方式: XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler(handler); xmlReader.parse(new InputSource(is)); 使用SAXParser方式: saxParser.parse(is,handler); 【附】:android应用单元测试方法 ①:在AndroidManifest.xml中添加节点 <uses-library android:name="android.test.runner" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.gzu.xmlparsertest" /> ②:建立测试类继承AndroidTestCase 【源代码如下:】 */ /****************************************【源码】START**************************************************/ //1.Person.java public class Person {
private Integer id;
private String name;
private short age;
public Person() {
super();
}
public Person(String name,short age) {
super();
this.name = name;
this.age = age;
}
public Person(Integer id,String name,short age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
// getter and setter ...
}
//2.SAXForHandler.java
public class SAXForHandler extends DefaultHandler {
private static final String TAG = "SAXForHandler";
private List<Person> persons;
// 记录前一个标签的名称
private String preTag;
// 记录当前Person对象
Person person;
public List<Person> getPersons() {
return persons;
}
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<Person>();
Log.i(TAG,"********** startDocument execute **********");
}
@Override
public void startElement(String uri,Attributes attributes) throws SAXException {
if("person".equals(localName)){
for(int i=0;i<attributes.getLength();i++){
Log.i(TAG," attributeName :"+attributes.getLocalName(i)+
" attributeValue :"+attributes.getValue(i));
person = new Person();
person.setId(Integer.parseInt(attributes.getValue(i)));
}
}
preTag = localName;
Log.i(TAG,"***** startElement execute *****"+qName);
}
@Override
public void characters(char[] ch,int length)
throws SAXException {
String data = new String(ch,start,length).trim();
if(!"".equals(data.trim())){
Log.i(TAG," content :"+data.trim());
if("name".equals(preTag)){
person.setName(data);
}else if("age".equals(preTag)){
person.setAge(new Short(data));
}
}
}
@Override
public void endElement(String uri,String qName)
throws SAXException {
Log.i(TAG,"***** endElement execute *****"+qName);
if("person".equals(localName)){
persons.add(person);
person = null;
}
preTag = null;
}
@Override
public void endDocument() throws SAXException {
Log.i(TAG,"********** endDocument execute **********");
}
}
//3.SAXParserUtil.java
public class SAXParserUtil {
public static List<Person> saxXml (InputStream is) throws Exception{
SAXForHandler saxForHandler = new SAXForHandler();
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(is,saxForHandler);
List<Person> persons = saxForHandler.getPersons();
is.close();
return persons;
}
}
//4.单元测试类 SAXParserTest.java
public class SAXParserTest extends AndroidTestCase {
private static final String TAG = "SAXParserTest";
public void testSAXGetPerson() throws Throwable{
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = SAXParserUtil.saxXml(is);
String text = "";
for(Person p:persons){
text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"n";
}
Log.i(TAG,text);
}
}
//5.MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView main = (TextView) findViewById(R.id.main_content);
InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
try {
List<Person> persons = SAXParserUtil.saxXml(is);
String text = "";
for(Person p:persons){
text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"n";
}
main.setText(text);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//6.AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.gzu.xmlparsertest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" />
<activity
android:name="cn.gzu.xmlparsertest.MainActivity"
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>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.gzu.xmlparsertest" />
</manifest> /****************************************【源码】END**************************************************/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
