初涉Android之Pull解析XML文件
程序员文章站
2022-05-23 09:02:47
...
使用Pull解析XML文件
一、大家都知道在XML文件中,主要是使用结点进行标识,其中主要分为两种结点,第一种是Element,也就是标签结点,第二种是Node,也就是文本结点。而使用Pull解析XML文件的时候,解析到一个结点,就会产生一个事件(Event),每个事件根据结点的类型也位置,产生不同的事件状态,我们要做的就是根据不同的事件状态进行不同的处理,即可完成对XML文件的解析工作。
解析时的事件状态主要分为以下几种:
- START_DOCUMENT:文档开始,我们在这个状态下,主要做初始化工作
- END_DOCUMENT:文档结束,解析完成,终止解析
- START_TAG:标签开始,正式开始解析文件内容
- END_TAG:标签结束,处理解析结果
public static List<Person> getPersons(InputStream xml) throws XmlPullParserException, NumberFormatException, IOException { List<Person> persons = null; // 获取XmlPullParser解析器 XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(xml, "UTF-8"); // 获取当前事件类型 int eventType = pullParser.getEventType(); Person person = null; // 文件件结束时终止循环 while(eventType != pullParser.END_DOCUMENT) { switch(eventType) { case XmlPullParser.START_DOCUMENT : persons = new ArrayList<Person>(); break; case XmlPullParser.START_TAG : // getName():获取标签名 if("person".equals(pullParser.getName())) { // getAttributeValue(index):获取标签属性 Integer id = new Integer(pullParser.getAttributeValue(0)); person = new Person(); person.setId(id); } else if("name".equals(pullParser.getName())) { // nextText(): 获取标签中间的文本结点的内容 String name = pullParser.nextText(); person.setName(name); } else if("age".equals(pullParser.getName())) { Integer age = new Integer(pullParser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG : if("person".equals(pullParser.getName())) { persons.add(person); } break; } // next():读取下一个结点 eventType = pullParser.next(); } return persons; }
二、将内存的信息保存为XML文件
我们可以使用两种方法进行XML文件的保存,第一种是使用StringBuilder,进行拼写字符串,然后用输出流将其写入文件之中,比较简单但不推荐使用,第二种是使用XmlSerializer类进行文件的保存。
/** * 将List集合保存为XML格式 * @param os 数据输出流 * @param persons 数据存储的集合类 * @throws IllegalArgumentException * @throws IllegalStateException * @throws IOException */ public static void save(OutputStream os , List<Person> persons) throws IllegalArgumentException, IllegalStateException, IOException { XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(os, "UTF-8"); serializer.startDocument("UTF-8", true); serializer.startTag(null, "persons"); for(Person person : persons) { serializer.startTag(null, "person"); serializer.attribute(null, "id", person.getId().toString()); serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge().toString()); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); os.flush(); os.close(); }
三、使用SharedPreferences进行参数的存储
在SharedPreferences内部,同样使用的是XML格式对文件的参数进行存储的。所以在这儿,将其介绍一下,同时也推荐各位在应用参数设置的时候考虑使用SharedPreferences。
import java.util.HashMap; import java.util.Map; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; public class FileService { SharedPreferences preferences = null; public FileService(Context context) { preferences = context.getSharedPreferences("richinfo", Context.MODE_PRIVATE); } /** * 保存设定的参数 */ public void save(String name , Integer age) { Editor editor = preferences.edit(); editor.putString("name", name); editor.putInt("age", age); editor.commit(); } /** * 使用SharedPreferences读取文件参数 * @return Map<String, String> 返回参数集合 */ public Map<String , String> readParameters() { Map<String , String> map = new HashMap<String , String>(); map.put("name", preferences.getString("name", "")); map.put("age", String.valueOf(preferences.getInt("age", 0))); return map; } }
下一篇: 宅男的一天