Xml解析方式之Pull解析器的使用

来源:互联网 发布:命令与征服 知乎 编辑:程序博客网 时间:2024/04/25 17:28

xml有多种解析的方式,这篇文章只介绍用pull解析器来解析XML文件,接下来我会说明使用Pull解析器来读取Xml文件内容和新建Xml文件。

  1. 读取Xml文件的内容
    我在项目中已经添加了一个Xml文件,“data.xml”,下面是Xml文件里面的内容。
    <?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>
    为了方便操作,我新建了一个Person类:

    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;}@Overridepublic 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_InputStreamXml文件输入流 * @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的值,我们就可以知道解析器当前的解析内容是哪一行,然后进行相关的操作。

  2. 新建Xml文件,然后保存到手机上
新建Xml文件的时候,同样要使用封装类,XmlSerializer serializer = Xml.newSerializer(),这样,我们对XmlSerializer的对象进行操作,然后就可以把信息保存到手机上了。

下面是我MainActivity中的代码:

public class MainActivity extends Activity {private TextView text;StringBuilder sb;@Overrideprotected 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解析器了。

0 0