今天去书城看书,突然看到android网络编程方面,看到各种解析xml的方式,选择了一种比较高效的方式,写了一个demo测试。SAX这种方式以前有看过,但是一直没有使用过,感觉不写demo,自己永远不会使用。
工程结构如下:
需要解析的xml文件放在assets目录下,也可以放在其他目录。
person.xml内容如下:
<?xml version="1.0" encoding="utf-8"?> <Persons> <Person id = "0"> <name>"张山"</name> <age>"16"</age> </Person> <Person id = "1"> <name>"李四"</name> <age>"17"</age> </Person> <Person id = "2"> <name>"王五"</name> <age>"18"</age> </Person> </Persons>主要进行解析工作的是SaxHander.java,代码如下:
package com.demo.saxxml; 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; /** * 此类主要负责对xml文档进行解析,继承DefaultHandler接口。 * 主要实现几个常用接口即可完成xml的解析。 * * @author Jacky Zhu * */ public class SaxHander extends DefaultHandler { private final String TAG = "SaxHander"; private List<Person> persons; private Person person; // 用于标记上一次遍历的是哪个element,用于存储对应的文本 private String preTag; /** * 在开始解析xml文档时会执行此方法,在此方法中,可以做一些数据初始化的工作。 */ @Override public void startDocument() throws SAXException { super.startDocument(); Log.i(TAG, "startDocument::"); persons = new ArrayList<Person>(); } /** * 在开始解析一个元素的时候执行此方法,在此方法中,根据localname来判定读取的是哪个元素。 * 主要是用于获取元素的属性值,并且存储。 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { Log.i(TAG, "startElement::" + localName); super.startElement(uri, localName, qName, attributes); if ("Person".equals(localName)) { person = new Person(); //因为person只有一个属性,可以这样去获取,若有多个时,可以采用循环的方式。 person.setId(attributes.getValue(0)); } // 这一步很关键,否则将会导致读取文本值的错误。 preTag = localName; } /** * 在开始解析元素文本值的时候调用此方法,在此方法中,要根据上一次解析的元素来存储文本。 * 空白文本也是可以被读取的,为了不被存储,必须进行和空比较。 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); // 获取文本内容 String content = new String(ch, start, length).trim(); Log.i(TAG, "characters::" + content); if (!"".equals(content.trim())) { // 屏蔽空白文本 if ("name".equals(preTag)) { person.setName(content); } else if ("age".equals(preTag)) { person.setAge(content); } } } /** * 解析元素结束时调用此接口,当是实体是要添加进实体集合。 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); Log.i(TAG, "endElement::"); if ("Person".equals(localName)) { persons.add(person); person = null; } } /** * 结束文档解析时调用此接口。 */ @Override public void endDocument() throws SAXException { super.endDocument(); Log.i(TAG, "endDocument::"); } /** * 获取解析得到的实体集合。 * @return */ public List<Person> getPersons() { if (persons != null) { return persons; } return null; } }
对应于xml中person的实体类,代码如下:
package com.demo.saxxml; /** * 实体类,对应于xml定义的实体属性。 * @author Jacky Zhu * */ public class Person { private String id; private String name; private String age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
package com.demo.saxxml; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import android.app.Activity; import android.os.Bundle; import android.util.Log; /** * 载入xml文件和开始解析文档 * @author Jacky Zhu * */ public class SaxXmlActivity extends Activity { private final String TAG = "SaxXmlActivity"; private List<Person> persons = new ArrayList<Person>(); private InputStream xmlInputStream; private SaxHander mSaxHander; private SAXParser mSAXParser; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { // 获取文件流 xmlInputStream = getAssets().open("person.xml"); // 获取解析接口 mSaxHander = new SaxHander(); // 获取解析类 mSAXParser = SAXParserFactory.newInstance().newSAXParser(); // 开始解析 mSAXParser.parse(xmlInputStream, mSaxHander); // 获取解析实体集合 persons = mSaxHander.getPersons(); for( int i = 0; i< persons.size(); i++){ System.out.println("id:"+persons.get(i).getId()); System.out.println("name:"+persons.get(i).getName()); System.out.println("age:"+persons.get(i).getAge()); } } catch (IOException e) { e.printStackTrace(); Log.i(TAG, "IOException::"+e.toString()); } catch (ParserConfigurationException e) { e.printStackTrace(); Log.i(TAG, "ParserConfigurationException::"+e.toString()); } catch (SAXException e) { e.printStackTrace(); Log.i(TAG, "SAXException::"+e.toString()); } } }
程序运行结果: