xml有多种解析的方式,这篇文章只介绍用pull解析器来解析XML文件,接下来我会说明使用Pull解析器来读取Xml文件内容和新建Xml文件。
- 读取Xml文件的内容
我在项目中已经添加了一个Xml文件,“data.xml”,下面是Xml文件里面的内容。
为了方便操作,我新建了一个Person类:<?xml version="1.0" encoding = "utf-8"?> <persons> <person id = "23"> <name>Jack</name> <age>18</age> </person> <person id = "20"> <name>Tom</name> <age>21</age> </person> </persons>
public class Person { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]"; } public Person(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public Person() { } }
然后我又建了一个PersonService类,在这个类里面实现我们的操作。
public class PersonService { /** * 获取Xml文件的内容 * @param p_InputStream Xml文件输入流 * @return 包含Person信息的列表 * @throws Exception */ public static List<Person> getPersons(InputStream p_InputStream) throws Exception{ List<Person> persons = null; Person person = null; //得到XmlPullParse对象 XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(p_InputStream, "utf-8"); int event = pullParser.getEventType(); while(event != XmlPullParser.END_DOCUMENT){ switch (event) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if("person".equals(pullParser.getName())){ person = new Person(); int id = new Integer(pullParser.getAttributeValue(0)); person.setId(id); } if("name".equals(pullParser.getName())){ String name = pullParser.nextText(); person.setName(name); } if("age".equals(pullParser.getName())){ int age = new Integer(pullParser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG : if("person".equals(pullParser.getName())){ persons.add(person); person = null; } break; } event = pullParser.next(); } return persons; } /** * 保存数据到XML文件中 * @param p_Person 数据列表 * @param p_Out 输出流 * @throws Exception 抛出异常 */ public static void save(List<Person> p_Person,OutputStream p_Out) throws Exception{ XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(p_Out, "utf-8"); serializer.startDocument("utf-8", true); serializer.startTag(null, "persons"); for(Person person:p_Person){ serializer.startTag(null, "person"); serializer.attribute(null, "id", person.getId()+""); serializer.startTag(null, "name"); serializer.text(person.getName()); serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge()+""); serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); p_Out.flush(); p_Out.close(); } }
在这个类里面,我共定义了两个静态方法,一个用来读取Xml文件的内容,然后把信息放到一个列表中,另一个用来生成Xml文件,保存到手机中。
读取Xml的时候,我们需要先得到XmlPullParser的对象,利用Xml类的一个静态方法来得到:Xml.newPullParser(),然后我们把Xml文件输入流和XmlPullParse对象进行设置或者说是连接:pullParser.setInput(p_InputStream, "utf-8"),然后就开始解析Xml文件了。
解析的时候是逐行开始解析的,int event = pullParser.getEventType(),这行代码开始可能不理解,比方说,此时解析器解析的内容是<person id = "23">,那么此时event的值就是XmlPullParser.START_TAG,代表着开始标签,在代码中还有其他的一些值,END_TAG-->结束标签等等。根据event的值,我们就可以知道解析器当前的解析内容是哪一行,然后进行相关的操作。
- 新建Xml文件,然后保存到手机上
下面是我MainActivity中的代码:
public class MainActivity extends Activity {
private TextView text;
StringBuilder sb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
sb = new StringBuilder();
sb.append("源文件的内容\n");
InputStream xml = getClass().getClassLoader().getResourceAsStream("data.xml");
try {
List<Person> persons = PersonService.getPersons(xml);
for(Person person:persons)
sb.append(person.toString()).append("\n");
text.setText(sb);
} catch (Exception e) {}
sb.append("新建的文件的内容\n");
List<Person> p = new ArrayList<Person>();
p.add(new Person(13, "lili", 18));
p.add(new Person(23, "liufi", 45));
File xmlFile = new File(getApplicationContext().getFilesDir(),"person.xml");
try {
OutputStream outputStream = new FileOutputStream(xmlFile);
PersonService.save(p, outputStream);
} catch (Exception e) {}
try {
xml = new FileInputStream(getApplicationContext().getFilesDir()+"/person.xml");
List<Person> persons = PersonService.getPersons(xml);
for(int i=0;i<persons.size();i++)
sb.append(persons.get(i).toString()).append("\n");
text.setText(sb);
} catch (Exception e1) {}
}
}
写的
内容不多,代码倒是挺多的,因为内容比较基础,所以看看代码就可以明白解析的方式,多用用就可以很快的掌握了Pull解析器了。