一.xml介绍:
1.XML:Extensible Markup Language,即可扩展标记语言. 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.
二.Xml解析:
1.PULL
Pull 内置于 Android 系统中。也是官方解析布局文件所使用的方式。Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。
而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。
2.SAX
SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。缺点是不能倒退。
3.DOM
DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点是加载大文档时效率低下。
4.SAX、DOM、Pull三种解析方式的比较
内存占用:SAX、Pull比DOM要好;
编程方式:SAX 采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类 XML,就要编写一个新的适合该类XML的处理类。DOM 是 W3C 的规范,Pull 简洁。
访问与修改:SAX 采用流式解析,DOM 随机访问。
访问方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。
1.Pull解析
package com.example.day12_xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
public class PullUtils {
public static ArrayList<Student> pull(InputStream is){
ArrayList<Student> list = new ArrayList<>();
try {
//获取解析工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//获取解析工厂对象
XmlPullParser xmlPullParser = factory.newPullParser();
//放入解析数据
xmlPullParser.setInput(is,"UTF-8");
//开始解析
int type = xmlPullParser.getEventType();
Student student = null;
while (type != XmlPullParser.END_DOCUMENT){
if (type == XmlPullParser.START_TAG){
if ("Student".equals(xmlPullParser.getName())){
student = new Student();
}else if ("name".equals(xmlPullParser.getName())){
String age = xmlPullParser.getAttributeValue(0);
String sex = xmlPullParser.getAttributeValue(1);
student.setAge(age);
student.setSex(sex);
String name = xmlPullParser.nextText();
student.setName(name.trim());
}else if ("hobby".equals(xmlPullParser.getName())){
String hobby = xmlPullParser.nextText();
student.setHobby(hobby.trim());
}
}else if (type == XmlPullParser.END_TAG){
if ("Student".equals(xmlPullParser.getName())){
list.add(student);
}
}
type = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
2.DOM解析
package com.example.day12_xml;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import java.io.IOException;
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 DomUtils {
public static ArrayList<Student> dom(InputStream is) throws ParserConfigurationException, IOException, SAXException {
ArrayList<Student> list = new ArrayList<>();
//获取解析工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//获取解析工厂对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//放入解析数据
Document document = documentBuilder.parse(is);
NodeList students = document.getElementsByTagName("Student");
for (int i = 0; i < students.getLength(); i++) {
Node student = students.item(i);
Student stu = new Student();
NodeList childNodes = student.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node child = childNodes.item(j);
if (child.getNodeName().equals("name")){
String name = child.getTextContent();
NamedNodeMap map = child.getAttributes();
String age = map.getNamedItem("age").getNodeValue();
String sex = map.getNamedItem("sex").getNodeValue();
stu.setName(name);
stu.setSex(sex);
stu.setAge(age);
}else if (child.getNodeName().equals("hobby")){
String hobby = child.getTextContent();
stu.setHobby(hobby);
}
}
list.add(stu);
}
return list;
}
}
3.SAX解析
package com.example.day12_xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
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 SaxUtils {
public static ArrayList<Student> list = new ArrayList<>();
public static ArrayList<Student> sax(InputStream is) throws ParserConfigurationException, SAXException, IOException {
//获取解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//获取解析工厂对象
SAXParser saxParser = factory.newSAXParser();
//放入解析数据
saxParser.parse(is,new MyHelper());
return list;
}
static class MyHelper extends DefaultHandler{
Student student;
String str;
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if ("Student".equals(qName)){
student = new Student();
}else if ("name".equals(qName)){
String age = attributes.getValue(0);
String sex = attributes.getValue(1);
student.setAge(age);
student.setSex(sex);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("Student".equals(qName)){
list.add(student);
}else if ("name".equals(qName)){
student.setName(str);
}else if ("hobby".equals(qName)){
student.setHobby(str);
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String s = new String(ch, start, length);
String trim = s.trim();
if (!trim.equals("")){
str = trim;
}
}
}
}