在解析中,常用到的还有一种解析就是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数组","这里是其编码方式"),这个用法也是很广泛的。
【Android】pull解析xml文件+将数据存储为xml格式,并保存在内存里
最新推荐文章于 2021-05-26 18:00:29 发布