您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
21_采用pull解析 解析xml文件
发布时间:2021-02-10 16:00:57编辑:雪饮阅读()
使用资产管理器读取xml
首先在eclipse中assets资产目录是建立于src同目录,而在android studio中assets资产目录没有自动建立,要手动建立在src/main目录下
首先我们读取的目标xml文件长这样
然后建立一个读取xml文件的服务PersonService.java(与MainActivity.java同目录)如:
package com.example.myapplication;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class PersonService {
private Context context;
public PersonService(Context context) {
this.context = context;
}
/**
* 把person.xml的输入流 解析 转化成list集合
* @param filename assets目录下的文件名
* @return
*/
public List<Person> getPersons(String filename){
//资产文件管理器
AssetManager manager = context.getAssets();
try {
InputStream is = manager.open(filename);
//在android下使用pull解析xml文件
//1.获取pull解析器的实例
XmlPullParser parser = Xml.newPullParser();
//2.设置解析器的一些参数(编码要与xml文件编码一致)
parser.setInput(is, "utf-8");
// 获取pull解析器对应的事件类型
int type = parser.getEventType();
Person person = null;
List<Person> persons = new ArrayList<Person>();
//循环遍历xml文档,条件是:只要不到文档结束就一直遍历
int i=0;
while(type!=XmlPullParser.END_DOCUMENT){
//遍历到某个开始标签(这里是某个person)
boolean flag=false;
if(type==XmlPullParser.START_TAG){
//获取当前标签名称
if("person".equals(parser.getName())){
//这里语法看似不优雅,但是不可轻易去优化,这里读取xml解析器的逻辑与xml节点的上下层的关系去结合的理解,否则会感觉代码有问题
person = new Person();
//获取person标签的id属性,因为这里只有一个属性是id属性,id属性在该标签属性列表中索引为0
int id =Integer.parseInt( parser.getAttributeValue(0));
person.setId(id);
}
if("name".equals(parser.getName())){
String name =parser.nextText();
Log.i("name00",name);
person.setName(name);
}
if("age".equals(parser.getName())){
int age = Integer.parseInt( parser.nextText());
person.setAge(age);
}
}
//如果到达了当前person结束标签,则将当前的person添加进入集合并重置person
if(type==XmlPullParser.END_TAG){
Log.i("END_TAG",parser.getName()+"节点结束");
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
}
//当前person标签读取并处理结束后就再次next让游标向下继续读取
type = parser.next();
}
return persons;
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "获取person.xml失败", Toast.LENGTH_SHORT).show();
return null;
}
}
}
然后建立Person.java(与MainActivity.java同目录)用来做数据中转的单元以供PersonService.java 从xml中获取数据单元并建立为集合的基础支持,如:
package com.example.myapplication;
public class Person {
private int id;
private String name;
private int age;
public Person(){ }
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 100) {
this.age = age;
}else{
this.age = 0;
}
}
}
最后就可以在MainActivity中进行获取并回显到指定界面元素中
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) this.findViewById(R.id.TV);
PersonService service = new PersonService(this);
List<Person> persons = service.getPersons("person.xml");
StringBuffer sb = new StringBuffer();
for(Person person : persons){
String age = "年龄"+ person.getAge()+" ";
String name =person.getName()+" ";
String id = "id="+ person.getId()+"\n";
String row=age+name+id;
Log.i("row",row);
sb.append(row);
}
tv.setText( sb.toString());
}
}
关键字词:pull,xml,android
上一篇:20_知识点补充
下一篇:23_生成xml文件