方法一:我们使用pull
第一步:需要解析的persons.xml
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="23" grade="1"> <name>张三</name> <age>30</age> </person> <person grade="0" id="20"> <name>李四</name> <age>25</age> </person> </persons>
第二步:编码关键Java代码
/** * @param is 输入流 * @return 人员集合 * @throws Throwable */ public static List<Person> getPersons(InputStream is) throws Throwable { List<Person> personList = new ArrayList<Person>(); Person person = null; /** pull 解析工厂 */ XmlPullParserFactory pactory = XmlPullParserFactory.newInstance(); /** 过生工厂获取一个pull 解析器 */ XmlPullParser parser = pactory.newPullParser(); /**设定字符集编码*/ parser.setInput(is, "UTF-8"); /** 事件类型 * 读取到xml的声明返回数字0 START_DOCUMENT; * 读取到xml的结束返回数字1 END_DOCUMENT ; * 读取到xml的开始标签返回数字2 START_TAG * 读取到xml的结束标签返回数字3 END_TAG * 读取到xml的文本返回数字4 TEXT */ int event = parser.getEventType(); System.out.println("XmlPullParser.END_DOCUMENT:"+XmlPullParser.END_DOCUMENT); //返回1 System.out.println("XmlPullParser.START_DOCUMENT:"+ XmlPullParser.START_DOCUMENT);//返回1 System.out.println("XmlPullParser.END_TAG:"+XmlPullParser.END_TAG); //返回3 while (event != XmlPullParser.END_DOCUMENT) { String nodeName = parser.getName(); switch (event) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: if ("person".equals(nodeName)) { person = new Person(); person.setId(Integer.valueOf(parser.getAttributeValue(null,"id"))); person.setGrade(Integer.valueOf(parser.getAttributeValue(null,"grade"))); } else if ("name".equals(nodeName)) { person.setName(parser.nextText()); } else if ("age".equals(nodeName)) { person.setAge(Integer.valueOf(parser.nextText())); } break; case XmlPullParser.END_TAG: if ("person".equals(nodeName)) { personList.add(person); } break; default: break; } event = parser.next(); } return personList; }
pull 也可以解析文本内容。
parser.setInput(new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?><persons><person id=\"23\" grade=\"1\"><name>张三</name><age>30</age><image>zs</image></person><person grade=\"0\" id=\"20\"><name>李四</name><age>25</age><image>ls</image> </person></persons> "));
第三步:编写测试代码。并申请测试权限
public class MyPullTest extends AndroidTestCase { public void testPersonsPull(){ InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml"); try { List<Person> personList = PullDemoActivity.getPersons(is); for (Person p : personList) { System.out.println(p.toString()); } } catch (Throwable e) { e.printStackTrace(); } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hkrt.action" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="android.test.runner" /> <activity android:name=".PullDemoActivity" 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="com.hkrt.action" android:label="Tests for My App" /> <uses-permission android:name="android.permission.INTERNET"/> </manifest>
注:targetPackage="设到启动的Activity包下"
结果图:
方法二:我们使用SAX 解析。
XMLContentHandler.java
package com.hkrt.action; 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.hkrt.domain.Person; public class XMLContentHandler extends DefaultHandler { private List<Person> persons = null; private Person currentPerson; private String tagName = null;//当前解析的元素标签 public List<Person> getPersons() { return persons; } /* * 接收文档的开始的通知。 */ @Override public void startDocument() throws SAXException { persons = new ArrayList<Person>(); } /* * 接收字符数据的通知。 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { if(tagName!=null){ String data = new String(ch, start, length); if(tagName.equals("name")){ this.currentPerson.setName(data); }else if(tagName.equals("age")){ this.currentPerson.setAge(Short.parseShort(data)); } } } /* * 接收元素开始的通知。 * 参数意义如下: * namespaceURI:元素的命名空间 * localName :元素的本地名称(不带前缀) * qName :元素的限定名(带前缀) * atts :元素的属性集合 */ @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if(localName.equals("person")){ currentPerson = new Person(); currentPerson.setId(Integer.parseInt(atts.getValue("id"))); currentPerson.setGrade(Integer.parseInt(atts.getValue("grade"))); } this.tagName = localName; } /* * 接收文档的结尾的通知。 * 参数意义如下: * uri :元素的命名空间 * localName :元素的本地名称(不带前缀) * name :元素的限定名(带前缀) * */ @Override public void endElement(String uri, String localName, String name) throws SAXException { if(localName.equals("person")){ persons.add(currentPerson); currentPerson = null; } this.tagName = null; } }
测试:
public void testPersonsSax(){ InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("persons.xml"); try { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser saxParser = spf.newSAXParser(); //创建解析器 //设置解析器的相关特性,http://xml.org/sax/features/namespaces = true 表示开启命名空间特性 //saxParser.setProperty("http://xml.org/sax/features/namespaces",true); XMLContentHandler handler = new XMLContentHandler(); //File file = new File("解析内容"); //saxParser.parse(file, handler); saxParser.parse(inStream, handler); inStream.close(); List<Person> personList = handler.getPersons(); for (Person p : personList) { System.out.println("sax解析:"+p.toString()); } } catch (Exception e) { e.printStackTrace(); } }
结果图:
在应用中,具体用那个,那一个更好。请查看具体的资料。在此不多做描述。总之能用pull 就用pull。