android XML三种解析方式

来源:互联网 发布:java爬虫书籍推荐2016 编辑:程序博客网 时间:2024/05/16 13:50
import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.SAXParserFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.Attributes;import org.xml.sax.ContentHandler;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xml.sax.helpers.DefaultHandler;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlSerializer;import android.content.Context;import android.util.Log;import android.util.Xml;public class Utils {/* 示例xml * <?xml version="1.0" encoding="UTF-8"?> <studnets> <studnet id = "1"> * <name>zhangsan</name> <age>26</age> </studnet> <studnet id = "2"> * <name>lisi</name> <age>45</age> </studnet> </studnets> *///--------------------------------------------------------Pull---------------------------------------------------------------/** * 第一种解析方式:Pull解析 * 在android中Pull解析是优于其他两种解析方式的,已经被内置在了android里,不再需要导入任何jar包,解析方式类似于SAX解析 * @param inStream * @return * @throws Exception */public static List<Students> PullParser(InputStream inStream)throws Exception {Students student = null;List<Students> students = null;/* 通过Xml类创建一个新的Pull解析器 */XmlPullParser pullParser = Xml.newPullParser();/* 为parser设置输入流,并指定流文件的编码 */pullParser.setInput(inStream, "UTF-8");/* 开始解析,获取xml文件第一个节点的event类型 */int event = pullParser.getEventType();// 触发第一个事件/* 如果不是文档结尾就一直解析 */while (event != XmlPullParser.END_DOCUMENT) {switch (event) {case XmlPullParser.START_DOCUMENT:/* 开始解析时创建students对象 */students = new ArrayList<Students>();break;case XmlPullParser.START_TAG:if ("student".equals(pullParser.getName())) {int id = new Integer(pullParser.getAttributeValue(0));student = new Students();student.id = id;}if (student != null) {if ("name".equals(pullParser.getName())) {student.name = pullParser.nextText();}if ("age".equals(pullParser.getName())) {student.age = pullParser.nextText();}}break;case XmlPullParser.END_TAG:/* 解析完成 */if ("students".equals(pullParser.getName())) {students.add(student);student = null;}break;}event = pullParser.next();}return students;}/** * 通过Pull方式来保存数据 优点:简单容易理解,同样属于推荐的方式 * @param persons * @param outStream * @throws Exception */public static void PullSave(List<Students> students, OutputStream os)throws Exception {XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(os, "UTF-8");serializer.startDocument("UTF-8", true);serializer.startTag(null, "students");/* 可以看出规律,都是对称生成的 */for (Students student : students) {serializer.startTag(null, "student");serializer.attribute(null, "id", student.id + "");serializer.startTag(null, "name");serializer.text(student.name);serializer.endTag(null, "name");serializer.startTag(null, "age");serializer.text(student.age);serializer.endTag(null, "age");serializer.endTag(null, "student");}serializer.endTag(null, "students");serializer.endDocument();os.flush();os.close();}//-----------------------------------------------------------SAX-------------------------------------------------------------------/** * SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析,并且可以在解析文档的任意时刻停止解析 * @return * @throws Exception */public static List<Students> SAXParser(InputSource source) throws Exception {/* 创建一个sax工厂实例 */SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();/* 最终数据存储到这里 */List<Students> students = null;Students student = null;try {XMLReader reader = saxParserFactory.newSAXParser().getXMLReader();/* 在这里面进行解析 */SAXHandler saxHandler = new SAXHandler();reader.setContentHandler(saxHandler);reader.parse(source);/* 获取解析结果 */students = saxHandler.getData();} catch (Exception e) {}return students;}//--------------------------------------------------------------DOM----------------------------------------------------------------/** * DOM解析:一次性将xml文档加载进内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件 优点:结构清晰,操作方便 * 缺点:占用内存过大,一般不推荐使用 * * @param inStream * @return * @throws Exception */public static List<Students> DOMParser(InputStream inStream)throws Exception {List<Students> students = new ArrayList<Students>();/* 获取解析器的实例 */DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();/* 将流转解析为Document对象 */Document document = builder.parse(inStream);/* 获取根元素 */Element root = document.getDocumentElement();/* 获取根节点的集合 */NodeList studentNodes = root.getElementsByTagName("studnets");for (int i = 0; i < studentNodes.getLength(); i++) {Element personElement = (Element) studentNodes.item(i);Students student = new Students();/* 读取到id */int id = new Integer(personElement.getAttribute("id"));student.id = id;/* 获取子节点的集合 */NodeList childNodes = personElement.getChildNodes();for (int j = 0; j < childNodes.getLength(); j++) {Node itemNode = childNodes.item(j);// 判断当前节点是否是元素类型节点if (itemNode.getNodeType() == Node.ELEMENT_NODE) {if ("name".equals(itemNode.getNodeName())) {// 取得元素节点的第一个子节点的文本值student.name = itemNode.getFirstChild().getNodeValue();} else if ("age".equals(itemNode.getNodeName())) {student.age = itemNode.getFirstChild().getNodeValue();}}}students.add(student);}inStream.close();return students;}}//------------------------------------------------------------------------------------------------------------------------------/** * 示例实体类 * @author xiaoyuan */class Students {String name;String age;int id;}//------------------------------------------------------------------------------------------------------------------------------//SAXHandler代码/** * sax解析的主要功能类 * 在这里将xml进行解析 * @author xiaoyuan */class SAXHandler extends DefaultHandler {private static final String STUDENTSSTRING = "student";private static final String TAG = "SAXHandler";private List<Students> students = null;private Students student = null;private String tempString = null;@Overridepublic void startDocument() throws SAXException {super.startDocument();students = new ArrayList<Students>();}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {super.characters(ch, start, length);if (student != null) {String valueString = new String(ch, start, length);if ("name".equals(tempString)) {student.name = valueString;} else if ("age".equals(tempString)) {student.age = valueString;}}}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {super.startElement(uri, localName, qName, attributes);if (STUDENTSSTRING.equals(localName)) {student = new Students();student.id = Integer.parseInt(attributes.getValue("id"));}tempString = localName;}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException {super.endElement(uri, localName, qName);if (STUDENTSSTRING.equals(localName) && student != null) {students.add(student);student = null;Log.d(TAG, "endElement ------- :一个解析对象完成 。。。。 ");}tempString = null;}@Overridepublic void endDocument() throws SAXException {super.endDocument();Log.d(TAG, "endDocument ------- :");}/** * 返回解析结果 * @return */public List<Students> getData() {return students;}}

原创粉丝点击