【Android】pull解析xml文件+将数据存储为xml格式,并保存在内存里

来源:互联网 发布:梦幻西游手游 for mac 编辑:程序博客网 时间:2024/05/22 06:08

在解析中,常用到的还有一种解析就是pull去解析xml格式的文件。事实上android内部也是这样做的。今天这个demo是来自传智播客,可能技术已经被翻新了。

但是基础原理还是那样,希望基础学习者,能够理解,并实际写一写。

首先在src目录下导入我们将要解析的xml文件:

<?xml version="1.0" encoding="utf-8"?><persons>    <person id="25">        <name>方世玉</name>        <age>18</age>    </person>    <person id="26">        <name>方天廖</name>        <age>18</age>    </person></persons>

在接下来的步骤就是解析上面这个xml文件。前提是我们对着这xml文件有一定的基础了解,大致知道每一句的作用及在xml中是什么身份。

首先, <?xml version="1.0" encoding="utf-8"?>这句话是什么呢?

这是该xml的start Document。在末尾是end Document。

<persons>是该xml的TAG,在这里每一个对象就是一个TAG,可以这样说。

  <name>方世玉</name> 每个标签中间是Text。

了解一些基础知识之后,我们就可以进行解析了。


public static List<Person> Getpersonread(InputStream xml) throws Exception{List<Person> persons = null;Person person = null;XmlPullParser pullParser = Xml.newPullParser();//解析器将xml文件读到一个字符数组中,然后一个一个字符解析//为要破解的xml设置pullParser.setInput(xml, "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())){//pull指向person时,将id的值存到person对象里。int id = new Integer(pullParser.getAttributeValue(0));person = new Person();person.setId(id);}if("name".equals(pullParser.getName())){//pull指向name时,将name标签里的text值存到person对象里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://当event执行到END_TAG时,将person对象放到集合中,并将对象值置空。if("person".equals(pullParser.getName())){persons.add(person);person=null;}break;}event =pullParser.next();//这句话至关重要。}System.out.println("775757"+persons);return persons;}


主要就是上面的switch。一点一点来分析。

当event处理到end Document时,将循环结束,这样就可以将xml文件整个的解析完。

碰到Start Document时,将list的对象实例化出来。

当pull解析器指向Tag时,分了多种情况,每种情况,都在上面做了备注,很容易理解的。

event =pullParser.next();这句话呢,是将每次解析完一个标签后,都往后移动,这句话使的event不停地往下解析。

最终,解析就完毕了,在MainActivity里,你可以用TextView将解析的结果输出来,观察是否一致。

     private List<String>  init()throws Exception{    String a = null;    List<String> list = new ArrayList<String>();     InputStream xml = this.getClass().getClassLoader().getResourceAsStream("tata.xml");      System.out.println("********88888"+xml);         List<Person> persons = Personservices.Getpersonread(xml); System.out.println("8888"+persons.get(0).getName().toString()); for(Person person:persons){ a= person.toString(); list.add(a); System.out.println("88889999"+a); }return list;     }


这是我写的一个方法,用来返回list,在OnCreate方法里,直接调用就可以了。

person.toString()。这是我在person这个javaBeen里复写的方法,目的就是方便将所有值直接输出出来。


解析告一段落,这里讲解将集合或者 对象存储起来,按照xml格式。

以前的文章也有讲过文件存储,只不过,那个并不是xml格式罢了,感兴趣的同学可以去看看。

闲话不多说:

public static void save(List<Person> persons,OutputStream ouStream) throws Exception{XmlSerializer serializer =Xml.newSerializer();//可序列化的serializer.setOutput(ouStream, "utf-8");serializer.startDocument("utf-8", true);serializer.startTag(null, "persons");for(Person person:persons){serializer.startTag(null, "person");serializer.attribute(null, "id", String.valueOf(person.getId()));serializer.startTag(null, "name");serializer.text(person.getName());serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text(String.valueOf(person.getAge()));serializer.endTag(null, "age");serializer.endTag(null, "person");}serializer.endTag(null, "persons");serializer.endDocument();ouStream.flush();ouStream.close();}



有了上面的基础,这里很好理解了,基本就是水到渠成。

但是,这里我也曾经犯过错误就是int与String之间的转化问题,这里就不单独开贴了。

String类型转化int:

我一开始用toString(),但是结果不行,报错。

后来又强制类型转换,直接在后面+“”,终于可以了,包括到后来运行都没问题,生成的xml文件也能正常显示。但是,注意了我上面用的并不是这个方法,为什么呢?

因为在用pull去解析这个xml是出错了。类型问题出错,即使你在解析时,将其强制转化成Int也不行。

后来就用了 String.ValueOf();这个方法了,建议用这个,上面那个方法,实在是有点野蛮,有点强逼别人的感觉。不好。

当然既然讲到了类型转换就不得不提这个了

String result = new String ("这里是byte数组","这里是其编码方式"),这个用法也是很广泛的。




1 0
原创粉丝点击