android studio xml解析,Android Studio 解析XML的三种方法

本文详细介绍了Android中XML解析的三种常见方式:SAX、DOM和Pull解析器。SAX解析速度快、内存占用少,但不支持倒退;DOM一次性加载整个文档,适合小规模数据;Pull解析器则结合了SAX和DOM的优点,使用方便且高效。通过示例代码展示了如何将XML内容转换为实体类,并比较了三种解析方式的优缺点。在Android开发中,JSON更为主流,XML解析通常与网络请求和爬虫数据相关。
摘要由CSDN通过智能技术生成

一丶概述

文件解析要求,json解析和xml解析,前面文章说过Json转实体类,这里就说说解析XML

内容:

Android Studio 解析XML常见的三种方式:DOM PULL SAX (实现XML转实体类并打印输出)

效果演示:

0818b9ca8b590ca3270a3433284dd417.png

二丶正文

SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。 缺点是不能倒退。

DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。 缺点是加载大文档时效率低下。

Pull内置于Android系统中。也是官方解析布局文件所使用的方式。Pull与SAX有点类似,都提供了类似的事件,如开始元素和结束元素。不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而后在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。

SAX、DOM、Pull的比较: 1. 内存占用:SAX、Pull比DOM要好;  2. 编程方式:SAX采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类XML,就要编写一个新的适合该类XML的处理类。DOM是W3C的规范,Pull简洁。  3. 访问与修改:SAX采用流式解析,DOM随机访问。  4. 访问方式:SAX,Pull解析的方式是同步的,DOM逐字逐句

这里不做详细讲解,看注释,上代码

0818b9ca8b590ca3270a3433284dd417.png

XML

<?xml version="1.0"encoding="UTF-8"?>李雷30韩梅梅25 person.Java

public classPerson {

Integer id;String name;Short age;publicInteger getId() {

returnid;}

public voidsetId(Integer id) {

this.id= id;}

publicString getName() {

returnname;}

public voidsetName(String name) {

this.name= name;}

publicShort getAge() {

returnage;}

public voidsetAge(Short age) {

this.age= age;}

@OverridepublicString toString() {

return"Person{"+

"id="+ id+

", name='"+ name+ '\''+

", age="+ age+

'}';}

} XMLtoEntityActivity

public classXMLtoEntityActivity extendsAppCompatActivity {

privateTextView tv_show_entity;privateString string= "";@Overrideprotected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.xmlto_entity_activity);tv_show_entity= (TextView) findViewById(R.id.tv_show_entity);}

public voidstartXML(View view){

// SAXService saxService = new SAXService();// DOMService domService = new DOMService();PULLService pullService = newPULLService();try{

InputStream inputStream = getAssets().open("Users.xml");// List persons = saxService.getPerson(inputStream);// List persons = domService.getPersons(inputStream);List persons = pullService.getPersons(inputStream);for(Person person : persons) {

Log.e("TAG",person.toString());string+= person.toString();}

} catch(IOException e) {

e.printStackTrace();} catch(Exception e) {

e.printStackTrace();}

tv_show_entity.setText(string);}

} DOM方法

/*** 采用DOM解析XML内容*/public classDOMService {

publicList getPersons(InputStream inputStream) throwsException {

List persons = newArrayList<>();//获取DOM解析器工厂DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//获DOM解析器DocumentBuilder builder = factory.newDocumentBuilder();//将解析树放入内存,通过返回值Document来描述结果Document document = builder.parse(inputStream);//取得根元素Element root = document.getDocumentElement();//取得所有person节点集合NodeList personNodes = root.getElementsByTagName("person");for(inti = 0;i < personNodes.getLength();i++) {

Person person = newPerson();//取得person节点元素Element personElement = (Element) personNodes.item(i);//取得属性值并设置IDperson.setId(Integer.parseInt(personElement.getAttribute("id")));//获取person的子节点NodeList personChilds = personElement.getChildNodes();for(intj = 0;j < personChilds.getLength();j++) {

//判断当前节点是否是元素类型的节点if(personChilds.item(j).getNodeType() == Node.ELEMENT_NODE) {

Element childElement = (Element) personChilds.item(j);if("name".equals(childElement.getNodeName())) {

//获取孙节点的值person.setName(childElement.getFirstChild().getNodeValue());} else if("age".equals(childElement.getNodeName())) {

person.setAge(Short.parseShort(childElement.getFirstChild().getNodeValue()));}

}

}

persons.add(person);}

returnpersons;}

} PULL方法

/*** 采用PULL解析XML内容*/public classPULLService {

publicList getPersons(InputStream inputStream) throwsException {

List persons = null;Person person = null;//得到PULL解析器XmlPullParser parser = Xml.newPullParser();parser.setInput(inputStream,"UTF-8");//产生事件inteventType = parser.getEventType();//如果不是文档结束事件就循环推进while(eventType != XmlPullParser.END_DOCUMENT) {

switch(eventType) {

caseXmlPullParser.START_DOCUMENT://开始文档事件persons = newArrayList<>();break;caseXmlPullParser.START_TAG://开始元素事件//获取解析器当前指向的元素的名称String name = parser.getName();if("person".equals(name)) {

person = newPerson();person.setId(Integer.parseInt(parser.getAttributeValue(0)));}

if(person != null) {

if("name".equals(name)) {

//获取解析器当前指向元素的下一个文本节点的值person.setName(parser.nextText());}

if("age".equals(name)) {

person.setAge(Short.parseShort(parser.nextText()));}

}

break;caseXmlPullParser.END_TAG://结束元素事件//判断是都是person的结束事件if("person".equals(parser.getName())) {

persons.add(person);person = null;}

break;}

//进入下一个元素并触发相应的事件eventType = parser.next();}

returnpersons;}

} SAX方法

/*** 采用SAX解析XML内容*/public classSAXService {

publicList getPerson(InputStream inputStream) throwsException {

//得到SAX解析工厂SAXParserFactory factory = SAXParserFactory.newInstance();//得到SAX解析器SAXParser parser = factory.newSAXParser();PersonParser personParser = newPersonParser();parser.parse(inputStream,personParser);inputStream.close();returnpersonParser.getPersons();}

private final classPersonParser extendsDefaultHandler {

privateList persons= null;privateString tag= null;//记录当前解析到了那个元素节点名称privatePerson person;publicList getPersons(){

returnpersons;}

//一开始会执行这个方法,所以在这里面完成初始化@Overridepublic voidstartDocument() throwsSAXException {

persons= newArrayList<>();}

@Overridepublic voidstartElement(String uri,String localName,String qName,Attributes attributes) throwsSAXException {

//判断元素节点是否等于personif("person".equals(localName)) {

person= newPerson();//获取数据,参数为索引下标person.setId(Integer.parseInt(attributes.getValue(0)));}

tag= localName;}

@Overridepublic voidendElement(String uri,String localName,String qName) throwsSAXException {

if("person".equals(localName)) {

persons.add(person);person= null;}

tag= null;}

@Overridepublic voidcharacters(char[] ch, intstart, intlength) throwsSAXException {

if(tag!= null) {

//获取文本节点的数据String data = newString(ch,start,length);if("name".equals(tag)) {

person.setName(data);} else if("age".equals(tag)) {

person.setAge(Short.parseShort(data));}

}

}

}

}

总结:Android开发主流是传json,而XML解析一般跟网络请求,爬虫数据相关。当然两者也是可以相互转换的,Java只强大在于提供了很多的类和方法。只要你愿意学,方法总是有的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值