使用parser.next()可進入下一個元素並觸發相應事件,可使用一個switch對感興趣的事件進行選擇和處理。
調用parser.nextText()獲取下一個Text類型元素的值。
可在www.xmlpull.org下載Pull解析器源碼和文檔。
【特點】結構簡單(一個藉口,一個例外,一個工廠組成);
簡單易用(只用一個重要方法next()檢索下一個事件,
5個事件:START_DOCUMENT,START_TAG,TEXT,END_TAG,END_DOCUMENT);
多功能性,最小的需求
使用步驟:
①:針對從XML中獲取到的信息,需對其建立一個對象(例:Person),存放相關信息
②:由Xml.newPullParser()創建XmlPullParser
③:設置資源並指定解析編碼 pullParser.setInput(is, "UTF-8");
④:測試需要,建立一個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");
加載需要解析的文件
*****************************
⑥:生成(保存)xml文檔:
通過Xml.newSerializer()獲取XmlSerializer序列生成器
設置編碼:xSerializer.setOutput(outputStream, "UTF-8");
xSerializer.startDocument("UTF-8", true);
建立File,以OutputStream形式進行生成
【附】: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.PullParseService.java
public class PullParseService {
/** Pull 解析Xml文檔 */
public static List<Person> getPersons(InputStream is) throws Exception{
List<Person> persons = null;
Person person = null;
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(is, "UTF-8");
int eventType = pullParser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(pullParser.getName())){
int id = Integer.valueOf(pullParser.getAttributeValue(0));
person = new Person();
person.setId(id);
}
if(person != null){
if("name".equals(pullParser.getName())){
person.setName(pullParser.nextText());
}
if("age".equals(pullParser.getName())){
person.setAge(new Short(pullParser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullParser.getName())){
persons.add(person);
person = null;
}
break;
}
eventType = pullParser.next();
}
return persons;
}
}
//3.單元測試類 SAXParserTest.java
public class SAXParserTest extends AndroidTestCase {
private static final String TAG = "SAXParserTest";
public void testPullGetPerson() throws Throwable{
InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PullParseService.getPersons(is);
String text = "";
for(Person p:persons){
text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"\n";
}
Log.i(TAG, text);
}
}
//4.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 = testPull(is);
String text = "Pull ";
for(Person p:persons){
text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"\n";
}
main.setText(text);
} catch (Exception e) {
e.printStackTrace();
}
}
private List<Person> testPull(InputStream is) throws Exception{
return DomParserService.getPersons(is);
}
}
//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>
//7.xml生成方法(PullParseService.java中)
/** Pull 保存Xml文檔 */
public static void save(List<Person> persons,OutputStream os) throws Exception{
XmlSerializer xSerializer = Xml.newSerializer();
xSerializer.setOutput(os, "UTF-8");
xSerializer.startDocument("UTF-8", true);
xSerializer.startTag(null, "persons");
for(Person person : persons){
xSerializer.startTag(null, "person");
xSerializer.attribute(null, "id", person.getId().toString());
xSerializer.startTag(null, "name");
xSerializer.text(person.getName());
xSerializer.endTag(null, "name");
xSerializer.startTag(null, "age");
xSerializer.text(String.valueOf(person.getAge()));
xSerializer.endTag(null, "age");
xSerializer.endTag(null, "person");
}
xSerializer.endTag(null, "persons");
xSerializer.endDocument();
os.flush();
os.close();
}
//8.測試生成類方法
public void testPullSavePerson() throws Throwable{
File file = new File(this.getContext().getFilesDir(),"persons.xml");
FileOutputStream outputStream = new FileOutputStream(file);
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(101,"張五常",(short)21));
persons.add(new Person(102,"劉麗",(short)20));
persons.add(new Person(103,"吳雪雪",(short)19));
persons.add(new Person(104,"莉莉",(short)23));
PullParseService.save(persons, outputStream);
Log.i(TAG, "***************** testPullSavePerson **************");
}
//9.生成結果 persons.xml
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<persons>
<person id="101">
<name>張五常</name>
<age>21</age>
</person>
<person id="102">
<name>劉麗</name>
<age>20</age>
</person>
<person id="103">
<name>吳雪雪</name>
<age>19</age>
</person>
<person id="104">
<name>莉莉</name>
<age>23</age>
</person>
</persons>
/****************************************【源碼】END**************************************************/