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

在解析中,常用到的还有一种解析就是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数组","这里是其编码方式"),这个用法也是很广泛的。




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值