1.PULL
2.SAX
3.DOM
创建一个assets
中包含 一个xml文件
<?xml version="1.0" encoding="UTF-8"?>
<countrys>
<country id="12">
<name>中国</name>
<miaoshu>是个美丽富饶的国家</miaoshu>
</country>
<country id="13">
<name>美国</name>
<miaoshu>是个美丽的国家</miaoshu>
</country>
<country id="14">
<name>法国</name>
<miaoshu>是个浪漫的国家</miaoshu>
</country>
</countrys>
Pull 内置于 Android 系统中。也是官方解析布局文件所使用的方式。Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。
而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。
pull解析 如下
package com.example.zuoye6;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.InputStream;
import java.util.ArrayList;
public class Pulll {
ArrayList<asd> list = new ArrayList<>();
public ArrayList<asd> getpulll(InputStream inputStream) throws Exception {
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(inputStream,"UTF-8");
asd asd=null;
int eventType = xmlPullParser.getEventType();
while (eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
case XmlPullParser.START_TAG:
if("country".equals(xmlPullParser.getName())){
asd = new asd();
String attributeValue = xmlPullParser.getAttributeValue(0);
asd.setId(attributeValue);
}else if("name".equals(xmlPullParser.getName())){
String s = xmlPullParser.nextText();
asd.setName(s);
}else if("miaoshu".equals(xmlPullParser.getName())){
String s = xmlPullParser.nextText();
asd.setMiao(s);
}
break;
case XmlPullParser.END_TAG:
if("country".equals(xmlPullParser.getName())){
list.add(asd);
}
break;
}
eventType=xmlPullParser.next();
}
return list;
}
}
.SAX
SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。缺点是不能倒退。
package com.example.zuoye6;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class Sax {
public static ArrayList<bean> list = new ArrayList<>();
public static ArrayList<bean> getSax(InputStream inputStream){
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(inputStream,new getSax());
} catch (Exception e) {
}
return list;
}
static class getSax extends DefaultHandler{
bean bean;
String s;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if(qName.equals("food")){
bean = new bean();
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if(qName.equals("title")){
bean.setTitle(s);
}else if(qName.equals("pic")){
bean.setPic(s);
}else if(qName.equals("id")){
bean.setId(s);
}else if(qName.equals("num")){
bean.setNum(s);
}else if(qName.equals("food_str")){
bean.setFood_str(s);
}else if(qName.equals("collect_num")){
bean.setCollect_num(s);
}
if(qName.equals("food")){
list.add(bean);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
s= new String(ch, start, length);
}
}
}
DOM
DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点是加载大文档时效率低下。
package com.example.zuoye6;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
public class Dom {
public ArrayList<asd> getdom(InputStream inputStream){
ArrayList<asd> list = new ArrayList<>();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document parse = documentBuilder.parse(inputStream);
NodeList country = parse.getElementsByTagName("country");
for (int i=0;i<country.getLength();i++){
Node item = country.item(i);
asd asd = new asd();
NamedNodeMap attributes = item.getAttributes();
Node id = attributes.getNamedItem("id");
asd.setId(id.getNodeValue());
NodeList childNodes = item.getChildNodes();
for (int j=0;j<childNodes.getLength();j++){
Node aa = childNodes.item(j);
if("name".equals(aa.getNodeName())){
asd.setName(aa.getTextContent());
}else if("miaoshu".equals(aa.getNodeName())){
asd.setMiao(aa.getTextContent());
}
}
list.add(asd);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}