对于XML文件,有三种解析方式 SAX(Simple API for Xml);DOM(Document Object Model);PULL解析器,各自的缺优点咋这里不详细说明。
PULL解析器时android自带的Xml文件的解析器 跟SAX很类似
以下用代码解释(代码中附有中文解释)
package com.jiany.handler_test; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Xml; import android.view.View; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; public class PullParseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pull_parse); } public void pullParseXmlClick(View view) { //获取ArrayList对象 ArrayList<Person> list = pullParse(); //打印list元素 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } /** * 定义一个解析Xml文件解析方法 * * @return */ public ArrayList<Person> pullParse() { //创建一个ArrayList的对象,用于装入解析完后的Person的对象 ArrayList<Person> arrayList = new ArrayList<>(); //定义一个Person类对象(Person自行定义) Person person = null; //获取pull解析器的对象 XmlPullParser xmlPullParser = Xml.newPullParser(); //设置解析的文件流(这里的Xml文件我放在res/raw)用于添加到xmlPullParser对象中 InputStream inputStream = getResources().openRawResource(R.raw.person); try { //把等到的Xml文件input到xmlPullParser解析器中,并且文本编码为“UTF-8” xmlPullParser.setInput(inputStream, "UTF-8"); //获取当前的事件类型,用于判断文件是否开始解析 int eventType = xmlPullParser.getEventType(); //加入一个While循环解析 (判断是否文件解析结束,为flase下进行解析) while (eventType != XmlPullParser.END_DOCUMENT) { //用switch添加类型 switch (eventType) { //若当前类型为开始标记,执行以下case case XmlPullParser.START_TAG: //解析器获取标记名称 例:<标记名称>XXX</标记名称> String tag = xmlPullParser.getName(); //判断:若标记名称为person 则获取当前标记名称的属性 if ("person".equals(tag)) { //创建Person对象 person = new Person(); //获取当前标记名称的属性 (getAttributeValue(命名空间,属性的名称)) person.personid = Integer.parseInt(xmlPullParser.getAttributeValue(null, "personid")); //继续判断 } else if ("name".equals(tag)) { //获取当前标记名称的下一组Text person.name = xmlPullParser.nextText(); } else if ("age".equals(tag)) { person.age = Integer.parseInt(xmlPullParser.nextText()); } else if ("sex".equals(tag)) { person.sex = xmlPullParser.nextText(); } else if ("tel".equals(tag)) { person.tel = xmlPullParser.nextText(); } break; //若当前类型为结束标记,执行以下case case XmlPullParser.END_TAG: //判断标记名称是否为person。ture就把person加到arrayList中 if ("person".equals(xmlPullParser.getName())){ arrayList.add(person); } break; } //一个结束后,进行下一个解析 eventType = xmlPullParser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //返回一个的arrayList return arrayList; } }
</pre><div>person 类</div><pre class="java" name="code">public class Person {
int personid;
String name;
int age;
String sex;
String tel;
@Override
public String toString() {
return "Perosn{" +
"personid=" + personid +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", tel='" + tel + '\'' +
'}';
}
}
xml
<society>
<person personid = "1">
<name>建育</name>
<age>18</age>
<sex>男</sex>
<tel>13838389438</tel>
</person>
<person personid = "1">
<name>煎鱼</name>
<age>18</age>
<sex>男</sex>
<tel>13737379437</tel>
</person>
</society>