在网络存储过程中有很多时候会遇到XML文件解析和使用XML保存一些信息,解析XML文件用的比较多的方法是pull解析和SAX解析,但是我一般只用pull解析,下面就向cd卡写入一个XML文件,然后再使用pull解析的方法对文件进行解析。
一、向SD卡中写入一个XML文件:
/** * 向SD卡写入一个XML文件 * * @param v */ public void savexml(View v) { try { File file = new File(Environment.getExternalStorageDirectory(), "persons.xml"); FileOutputStream fos = new FileOutputStream(file); // 获得一个序列化工具 XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(fos, "utf-8"); // 设置文件头 serializer.startDocument("utf-8", true); serializer.startTag(null, "persons"); for (int i = 0; i < 10; i++) { serializer.startTag(null, "person"); serializer.attribute(null, "id", String.valueOf(i)); // 写姓名 serializer.startTag(null, "name"); serializer.text("张三" + i); serializer.endTag(null, "name"); // 写性别 serializer.startTag(null, "gender"); serializer.text("男" + i); serializer.endTag(null, "gender"); // 写年龄 serializer.startTag(null, "age"); serializer.text("1" + i); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); fos.close(); Toast.makeText(MainActivity.this, "写入成功", 0).show(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "写入失败", 0).show(); } }
1、设置XML文件保存的地址,2、获得一个序列化工具,3、写XML文件的头,4、循环写入信息。
最后得到的XML文件
二、解析本地XML文件
/** * 读取SD卡中的XML文件,使用pull解析 * * @param v */ public void readxml(View v) { try { File path = new File(Environment.getExternalStorageDirectory(), "persons.xml"); FileInputStream fis = new FileInputStream(path); // 获得pull解析器对象 XmlPullParser parser = Xml.newPullParser(); // 指定解析的文件和编码格式 parser.setInput(fis, "utf-8"); int eventType = parser.getEventType(); // 获得事件类型 String id = null; String name = null; String gender = null; String age = null; while (eventType != XmlPullParser.END_DOCUMENT) { String tagName = parser.getName(); // 获得当前节点的名称 switch (eventType) { case XmlPullParser.START_TAG: // 当前等于开始节点 <person> if ("persons".equals(tagName)) { // <persons> } else if ("person".equals(tagName)) { // <person id="1"> id = parser.getAttributeValue(null, "id"); } else if ("name".equals(tagName)) { // <name> name = parser.nextText(); }else if ("gender".equals(tagName)) { // <age> gender = parser.nextText(); } else if ("age".equals(tagName)) { // <age> age = parser.nextText(); } break; case XmlPullParser.END_TAG: // </persons> if ("person".equals(tagName)) { Log.i(TAG, "id---" + id); Log.i(TAG, "name---" + name); Log.i(TAG, "gender---" + gender); Log.i(TAG, "age---" + age); } break; default: break; } eventType = parser.next(); // 获得下一个事件类型 } } catch (Exception e) { e.printStackTrace(); }finally{ }
1、获取要解析XML文件的地址,2、获得pull解析工具,3、根据标签的不同判断并保存信息。
在解析过程中遇到一个问题,就是在解析完了之后,调用fis.close()函数时,会报bad file number的错误,检查了很久才发现是这句话的问题。
补充知识:Android 读取raw下的xml配置文件
1、获取数据流
// 读取配置文件
InputStream in = context.getResources().openRawResource(R.raw.cfg);
2、解析xml文件
public class XmlParser<T>{ public T xmlParser(InputStream xml) throws Exception { XmlPullParser pullParse = Xml.newPullParser(); pullParse.setInput(xml, "UTF-8"); int event = pullParse.getEventType(); while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: //文件开头 break; case XmlPullParser.START_TAG: //标签开始标志 //pullParse.getName() 获取标签名 //pullParse.getAttributeValue(0)获取标签的参数 //pullParse.nextText() 获取标签内的值 break; case XmlPullParser.END_TAG: //标签结束标志 break; } event = pullParse.next();//进行下一个标签的解析 } return T; } }
以上这篇Android实现向本地写入一个XML文件和解析XML文件就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/183277/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)