您的位置:首页 > 移动开发 > Android开发

Android之Pull解析XML文件

2016-07-10 13:56 495 查看
  Android默认使用内置的Pull解析器来解析xml文件。虽然SAX和DOM解析也能用,推荐使用pull解析。Pull解析类似于SAX解析,都采用事件驱动方式来进行解析。
  原理:不断地调用Pull解析器的next方法获取下一个解析事件的类型,根据事件类型
判断是否读取到文件的尾部。当处于某个元素处时,可调用getAttributeValue()方法获
取该元素的属性值,也可调用nextText()获取文本节点的值。调用getName()获取标签名。

步骤:

1.拿到加载资源文件XML的解析器

2.通过解析器获得事件类型

3.根据事件类型判断并获取相应的值

那来做下吧,

1.准备了一个简单的xml文件:

movies.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Movies>
<Movie id="1">
<name>愤怒的小鸟</name>
<type>animation</type>
<year>2016</year>
</Movie>
<Movie id="2">
<name>叶问</name>
<type>action</type>
<language>chinese</language>
</Movie>
</Movies>


在res文件下新建了一个文件夹xml:



2.可以看到最外层的节点 Movies 中包含两个 Movie ,而每个 Movie 中又包含三个属性:name 、type 、language

所以我们可以新建一个Movies 类来保存解析出来的每个 Movie , Movie中应该有四个属性 id 、name 、type 、language

Movies.java:

public class Movies {

private String id,name,type,language,year;

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 getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language = language;
}

public String getYear() {
return year;
}

public void setYear(String year) {
this.year = year;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "id:"+id+","+"name:"+name;
}
}
3.activity_main布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="pull"
android:text="pull解析"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

</LinearLayout>


4.    PULL解析器调用该getEventType()返回事件类型。

       XmlPullParser.END_DOCUMENT  文档解析结束

       XmlPullParser.START_DOCUMENT文档开始解析

       XmlPullParser.START_TAG    解析到开始标签

5.MainActivity:

public class MainActivity extends Activity {

private TextView tv;
private List<Movies>movies;
private Movies movie;

//用pull方式解析xml文件
public void pull(View view){
XmlResourceParser xmlResourceParser=getResources().getXml(R.xml.movies);
try {
//拿到第一个事件类型
int type=xmlResourceParser.getEventType();
while(type!=XmlResourceParser.END_DOCUMENT){
if(type==XmlResourceParser.START_DOCUMENT){
movies=new ArrayList<Movies>();
}
if(type==XmlResourceParser.START_TAG){
if("Movie".equals(xmlResourceParser.getName())){
movie=new Movies();
String id=xmlResourceParser.getAttributeValue(null,"id");
movie.setId(id);
System.out.println("id:"+id);
}
if("name".equals(xmlResourceParser.getName())){
String name=xmlResourceParser.nextText();
movie.setName(name);
System.out.println("name:"+name);
}
}
if(type==XmlResourceParser.END_TAG){
if("Movie".equals(xmlResourceParser.getName())){
movies.add(movie);
movie=null;
}
}
type=xmlResourceParser.next();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tv.setText(movies.toString());
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.tv);
}
}


效果图:



想要源码的点这:下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml Pull解析 安卓