大家晚上好,今天给大家讲解的是pull解析与生成xml文件,这主要有两个效果,其一,将完整格式的xml解析,在listView列表显示,这个知识点就要运用上几讲关于适配器知识点来做,其二,自己定义标准格式的xml文件,生成并发放在内部储存中。
由于这次的代码比较多,我主要讲解关键的代码,其他布局什么的,就不讲,有不懂可以是底下问我。
1.PullActivity.java
private ListView bookList; private List<Map<String,Object>> data; private Context context;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pull);
bookList = (ListView) findViewById(R.id.list); context = this;
try { //用输入流获取asset下的xml文件 InputStream is = getAssets().open("book.xml"); //调用业务层方法,方法的结果存在List的data值里 data = fileManager.parse(is); //创建简单型适配器,参数一:上下文,参数二:要存的数据 参数三:layout布局 ,参数四:从哪里来,key值 ,参数五:到哪里去,布局对应的Id SimpleAdapter adapter = new SimpleAdapter(this,data, R.layout.item_list,new String[] { "name","price" }, new int[] { R.id.name_et,R.id.price_et }); //设置适配器,展示数据 bookList.setAdapter(adapter);
} catch (Exception e) { e.printStackTrace(); }
}
/** *用按钮点击事件,导入xml文件到指定的文件夹 */ public void export(View v) { try { //获取导入的路径,getFilesDir() File rootPath = context.getFilesDir(); //创建文件,参数一:路径 ,参数二:xml命名 File file = new File(rootPath,"new2.xml"); //输出流写入数据 FileOutputStream fos = new FileOutputStream(file); Toast.makeText(context,"导入成功",Toast.LENGTH_SHORT).show();
//调用业务层的方法,传的参数是,data,fos, fileManager.export(data,fos); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
}
2.fileManager.java 业务层,主要书写方法
//定义声明
private static final String BOOK = "book"; private static final String BOOKS = "books"; private static final String NAME = "name"; private static final String ID = "id"; private static final String PRICE = "price";
public static List<Map<String,Object>> parse(InputStream is) throws Exception { List<Map<String,Object>> data = null; HashMap<String,Object> map = null;
//创建解析器 XmlPullParser parser = Xml.newPullParser(); //设置编码方式 parser.setInput(is,"utf-8"); //获取xml类型 int eventType = parser.getEventType(); //当条件满足时,开始执行循环 while (eventType != XmlPullParser.END_DOCUMENT) {
//switch case 判断
switch (eventType) { //开始文档 case XmlPullParser.START_DOCUMENT: //初始化保存的列表 data = new ArrayList<Map<String,Object>>();
break; //开始标签 case XmlPullParser.START_TAG: //得到开始标签下的属性值 String name = parser.getName();
//逐一开始判断,
//属性值的BOOK时 if (name.equals(BOOK)) { map = new HashMap<String,Object>(); //得到id值 String id = parser.getAttributeValue(0); map.put(ID,Integer.valueOf(id));
//属性值Name时 } else if (name.equals(NAME)) {
map.put(NAME,parser.nextText());
//属性值为PRICE时 } else if (name.equals(PRICE)) { map.put(PRICE,parser.nextText()); }
break; //结束标签 case XmlPullParser.END_TAG: if (parser.getName().equals(BOOK)) {
//添加到列表中 data.add(map); }
break;
default: break; }
//最关键的地方,每次都要在往下执行一次 eventType = parser.next(); }
返回已有数据的data值
return data;
}
/** *导入文件方法 */ public static void export(List<Map<String,Object>> data, FileOutputStream fos) throws Exception { //创建序号器,它有个特点,有了开始,必定有结束 XmlSerializer serializer = Xml.newSerializer(); //输出流的格式 serializer.setOutput(fos,"utf-8"); //开始文档 serializer.startDocument("utf-8",true); //开始标签,开始的标签的命名为BOOKS serializer.startTag(null,BOOKS);
//用map集合进行data遍历 for (Map map : data) { //下一个开始标签BOOK serializer.startTag(null,BOOK); //设置属性ID,用map得到id的实际值 serializer.attribute(null,ID,map.get(ID).toString()); //下一个开始标签,NAME serializer.startTag(null,NAME); //设置文本值 serializer.text(map.get(NAME).toString()); serializer.endTag(null,NAME);
//设置下一个开始标签PRICE serializer.startTag(null,PRICE); //设置PRICE值 serializer.text(map.get(PRICE).toString());
//结束标签 serializer.endTag(null,PRICE);
serializer.endTag(null,BOOK); } //结束标签有头也有尾 serializer.endDocument(); serializer.endTag(null,BOOKS); //关闭输出流 fos.close();
}
pull解析与生成就到这里,为什么要详细讲解这个解析呢,因为在我们做开发的时候,解析与生成xml最常用的方法就是pull,大家好好看看这篇博客,相信能给大家以后开发项目有用。时间过得很快,凌晨十二点多了,该洗洗睡,熬夜伤身,养好身体才有精力敲代码。晚安。
??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|