XML的解析和生成-阿里云开发者社区

开发者社区> 小弟的谷哥> 正文

XML的解析和生成

简介: package com.service; // 错误总结:在switch语句里面没有break,造成了错误 // 利用pull解析器解析XML // 步骤: // 1,声明一个null的List集合 // 2,声明一个null的person // 3,利用Xml类建立一个XmlPullParser类的对象parse // 4,为此解析器设置要接卸的对象及字符集编码 // 5,利用parser.getEventType()得到当前解析的对象的类型返回值是一个整型 // 6,核心的一步。
+关注继续查看
package com.service;
//  错误总结:在switch语句里面没有break,造成了错误
//  利用pull解析器解析XML
//  步骤:
//	1,声明一个null的List集合
//	2,声明一个null的person
//	3,利用Xml类建立一个XmlPullParser类的对象parse
//	4,为此解析器设置要接卸的对象及字符集编码
//	5,利用parser.getEventType()得到当前解析的对象的类型返回值是一个整型
//	6,核心的一步。利用此整型进行while循环,循环条件:不是document的结尾
//	       在while里采用的是switch()语句
//	
//	知识点:
//	利用parse.getName()来返回当前指向的标签的名字
//	利用parser.getAttributeValue()得到当前标签的属性值
//	利用parser.nextText()得到当前标签的文本值(相当于文本节点的值)。不是parser.getText()
//	利用event = parser.next();将指针下移
//	利用XmlPullParser的静态常量来判断当前读的是什么


//	将list里的数据写入到XML文档,该方法的参数是OutputStream和List,返回值为空
//	主要是利用了XmlSerializer类的对象
//	步骤:
//	1,建立XmlSerializer类的对象
//	2,为此XmlSerializer对象设置输出流
//	3,开始将list里的数据封装到XML
//	       注意:xml里的标签都是一对一对(即开始和结尾)出现的
//	4,关闭流
//	
//	主要的知识点:
//	serializer.startDocument()/serializer.endDocument();开始/结束一个document
//	serializer.startTag()/serializer.endTag()开启/结束一个标签
//	serializer.attribute()给一个标签设置属性值
//	serializer.text()给一个文本节点设置值
//	
//	总结:
//  XmlPullParser parse
//  XmlSerializer serializer都是通过Xml的静态方法得到的


import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.domain.Person;
public class XmlService {
//利用XmlPullParser解析XML
//将XML的数据封装到实体,然后放到一个集合中返回
	public List<Person> getXML(InputStream xml) throws Exception{		
		 ArrayList<Person> persons=null;
		 Person person=null;
		 XmlPullParser parser=Xml.newPullParser();
		 parser.setInput(xml, "UTF-8");
		 int event=parser.getEventType();
		 while(event!=XmlPullParser.END_DOCUMENT){
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				 persons=new ArrayList<Person>();
				 break;
			case XmlPullParser.START_TAG:
				if("person".equals(parser.getName())){
					person=new Person();
					String id=parser.getAttributeValue(0);
					person.setId(Integer.valueOf(id));
				}
				if("name".equals(parser.getName())&&person!=null){
					String name=parser.nextText();//注意不是getText();
					person.setName(name);
				}else if("age".equals(parser.getName())&&person!=null){
					String  age=parser.nextText();//注意不是getText();
					person.setAge(Short.valueOf(age));
				}
				break;
			case XmlPullParser.END_TAG:
				if("person".equals(parser.getName())){
					persons.add(person);
					person=null;
				}
				break;

			 }
			 
		 event=parser.next();
		 }
		 
		return persons;
	}
	
	

//将List<Person>里的数据放到XML文件中
	public void saveXML(OutputStream outputStream,List<Person> persons) throws Exception{
		XmlSerializer serializer=Xml.newSerializer();//也是通过Xml得到的
		serializer.setOutput(outputStream, "UTF-8");
		serializer.startDocument("UTF-8", null);
		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();
	}
	 
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据解析之 XPath & lxml 库
数据解析之 XPath & lxml 库
11 0
自然语言处理 NLP(4)
自然语言处理 NLP(4)
13 0
Java 设计模式
Java 设计模式
9 0
如何利用 Beautiful Soup 爬取网页数据
如何利用 Beautiful Soup 爬取网页数据
7 0
从零实现一个日志框架(带源码)
Java里的各种日志框架,相信大家都不陌生。Log4j/Log4j2/Logback/jboss logging等等,其实这些日志框架核心结构没什么区别,只是细节实现上和其性能上有所不同。本文带你从零开始,一步一步的设计一个日志框架
6 0
Kafka无消息丢失配置方案
kafka以其高性能、高吞吐、可扩展等出色能力,被广泛应用在各行各业,是事件流处理平台和消息队列中的佼佼者,但是经常可以看到有人在吐槽kafka消息丢失,但是真的是kafka的锅吗,本文我们就来认真分析一下到底哪些场景可能导致消息丢失以及使用怎么样的方案可以防止消息丢失。
12 0
基于flowcharting实现定制化业务链路动态监控
flowcharting是grafana社区提供的一款插件,其借助开源绘图工具drawio可以实现定制化的的业务链路动态监控,将各项监控指标以更加面向业务的图表形式进行展示,可以实现网络拓扑图、流程图、架构图等等各种图形,将比较分散的指标统一成可视化的监控图形。
10 0
小程序的开发之使用SVG
昨天突然提出要在小程序中使用SVG,因为我们的小程序项目是有主题色的。不同的主题色时有些图片一直是固定的,显的有些格格不入,所以打算使用SVG来实现根据主题色的颜色进行变化。
17 0
Spring 中经典的 9 种设计模式,打死也要记住啊!
实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。
8 0
Python知识点总结篇(4)
Python知识点总结篇(4)
11 0
+关注
小弟的谷哥
welcome
766
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载