1:sax
package com.xml.sax2; import android.util.Log; import com.xml.model.Students; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.util.ArrayList; import java.util.List; /** * 解析 students.xml 解析完后,调用.getList()方法获取数据,区别于SAXParserHandler使用回调 * <p> * <p> * <p> * 这是安卓中内置的用于SAX处理XML的类,但是大多情况下我们都需要继承该类重写部分方法,才能达到处理XML数据的功能。 * <p> * startDocument方法 * 这是第一个需要重写的方法,每处理一个XML文档都会响应一次。所以这个方法里可以写需要初始化的代码。 * <p> * startElement方法 * 这是处理每个节点所触发的第一个方法,通过这个方法你可以直接当前处理的节点的名称以及属性。 * <p> * characters方法 * 这是处理每个节点所触发的第二个方法,通过这个方法你可以直接当前处理的节点中的属性。 * <p> * endElement方法 * 这是处理每个节点所触发的第三个方法,遇到一个节点的结束标签时,将会出发这个方法,并且会传递结束标签的名称 * <p> * endDocument方法 * 如果当前的XML文档处理完毕后,将会触发该方法,在此方法内你可以将最终的结果保存并且销毁不需要使用的变量。 */ public class SAX2StudentsParserHandler extends DefaultHandler { private final String TAG = "SAX2"; private List<Students> list;//解析数据存储 Students students; Boolean currTag = false;//由于在<item></item>标签中有字符,需要做标记 String currTagVal = ""; public List<Students> getList() { return list; } /** * (1)文档开始 * * @throws SAXException */ @Override public void startDocument() throws SAXException { super.startDocument(); list = new ArrayList<Students>(); Log.d(TAG, "startDocument: "); } /** * (2)标签开始 * students.xml为例: * 标签顺序是 * <p> * <student group="z1" id="001"> * <name>张三</name> * <sex>男</sex> * <age>18</age> * <email>zhangsan@163.com</email> * <birthday>1987-06-08</birthday> * <memo>好学生</memo> * </student> * * @param uri * @param localName * @param qName * @param attributes * @throws SAXException */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); Log.d(TAG, "startElement: localName="+localName+"--qName="+qName); //遍历students标签 currTag = true; if (localName.equals("student")) { students = new Students(); //遍历解析student标签 for (int i = 0; i < attributes.getLength(); i++) { //item标签保存参数 id url (name的处理在charaters方法中) if (attributes.getLocalName(i).equals("id")) { students.setId(attributes.getValue(i)); } else if (attributes.getLocalName(i).equals("group")) { students.setGroup(attributes.getValue(i)); } } } } /** * (3)接口字符 * * @param ch * @param start * @param length * @throws SAXException */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); //student标签保存下获取子标签 if (currTag) { currTagVal = new String(ch, start, length); Log.d(TAG, "characters: currTagVal=" + currTagVal); currTag = false; } } /** * (4)标签结束 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); Log.d(TAG, "endElement: localName=" + localName + "- qName=" + qName); currTag = false; //标签结束后,保存子标签下值,并将信息保存到list中 if (localName.equals("student")) { list.add(students); } /** * startElement解析到该标签后,就会调用 characters方法获取数值,在endElement方法中保存数值 */ if (localName.equalsIgnoreCase("name")) { students.setName(currTagVal); } else if (localName.equalsIgnoreCase("sex")) { students.setSex(currTagVal); } else if (localName.equalsIgnoreCase("age")) { students.setAge(currTagVal); } else if (localName.equalsIgnoreCase("email")) { students.setEmail(currTagVal); } else if (localName.equalsIgnoreCase("birthday")) { students.setBirthday(currTagVal); } else if (localName.equalsIgnoreCase("memo")) { students.setMemo(currTagVal); } } /** * (5)文档结束 * * @throws SAXException */ @Override public void endDocument() throws SAXException { super.endDocument(); Log.d(TAG, "endDocument: "); } }2:pull
* */ private void xmlPullParser2() { InputStream inputStream2 = null; try { //创建factory XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //创建 XmlPullParser对象 // 方式一:使用工厂类XmlPullParserFactory // 方式二:使用Android提供的实用工具类android.util.Xml XmlPullParser pullParser2 = factory.newPullParser();//factory 可以用 Xml 类代替 //获取文件 AssetManager assetManager = getAssets(); inputStream2 = assetManager.open("channels.xml"); //解析格式 pullParser2.setInput(inputStream2, "UTF-8"); /** * 解析详情: * * xml的数据可能只有几个是所需的,所以可以根据case筛选需要的参数值 * */ int eventType = pullParser2.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) {//文档标签 switch (eventType) { case XmlPullParser.START_DOCUMENT://文档标签 //可以做初始化list操作 channelList = new ArrayList<>(); break; // 触发开始元素事件 case XmlPullParser.START_TAG: String tagName = pullParser2.getName();//获取标签名称 Log.d(TAG, "START_TAG:" + tagName); //获取item标签下的参数 id,group if (tagName.equals("item")) { channel = new Channel(); Log.d(TAG, "tagName:" + tagName + "--" + pullParser2.getAttributeValue(0) + "--" + pullParser2.getAttributeValue(1)); channel.setId(pullParser2.getAttributeValue(0)); channel.setUrl(pullParser2.getAttributeValue(1));//getAttributeName是获取key名称,getAttributeValue是获取value值 channel.setName(pullParser2.nextText()); channelList.add(channel);//保存到list中 channel = null; } break; case XmlPullParser.END_TAG://元素标签 结束, break; default: break; } eventType = pullParser2.next();///调用的是next的方法 来获取当前的状态 } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream2 != null) { try { inputStream2.close(); } catch (IOException e) { e.printStackTrace(); } } } }3:doc
private void xmlDomParser() { InputStream inputStream = null; try { //创建factory DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //创建 DocumentBuilder对象 DocumentBuilder builder = factory.newDocumentBuilder();//factory可以用Xml类代替 //获取文件 AssetManager assetManager = getAssets(); inputStream = assetManager.open("students.xml"); //创建Document对象,相当于代表xml表的对象 Document document = builder.parse(inputStream); //获取根节点 Element rootElement = document.getDocumentElement(); //获取根节点所有student的节点 NodeList parentNodeList = rootElement.getElementsByTagName("student"); /** * 遍历所有的节点 * */ list = new ArrayList<>(); //先遍历sutdent节点数据 for (int i = 0; i < parentNodeList.getLength(); i++) { //student节点 Element parentelement = (Element) parentNodeList.item(i); //获取student节点内的所有节点 NodeList childNodeList = parentelement.getChildNodes(); //获取<Students>标签内的参数 String group = parentelement.getAttribute("group"); String id = parentelement.getAttribute("id"); students = new Students(); students.setGroup(group); students.setId(id); //遍历student节点内的节点 for (int j = 0; j < childNodeList.getLength(); j++) { //多标签加 Node.ELEMENT_NODE判断 if (childNodeList.item(j).getNodeType() == Node.ELEMENT_NODE) { //依次赋值 if ("name".equals(childNodeList.item(j).getNodeName())) {//注意,这里不是:childNodeList.item(j).getFirstChild().getNodeName() String name = childNodeList.item(j).getFirstChild().getNodeValue(); Log.d(TAG, "name =" + name); students.setName(name); } else if ("sex".equals(childNodeList.item(j).getNodeName())) { String sex = childNodeList.item(j).getFirstChild().getNodeValue(); Log.d(TAG, "sex =" + sex); students.setSex(sex); } else if ("age".equals(childNodeList.item(j).getNodeName())) { String age = childNodeList.item(j).getFirstChild().getNodeValue(); Log.d(TAG, "age =" + age); students.setAge(age); } else if ("email".equals(childNodeList.item(j).getNodeName())) { String email = childNodeList.item(j).getFirstChild().getNodeValue(); Log.d(TAG, "email =" + email); students.setEmail(email); } else if ("birthday".equals(childNodeList.item(j).getNodeName())) { String birthday = childNodeList.item(j).getFirstChild().getNodeValue(); Log.d(TAG, "birthday =" + birthday); students.setEmail(birthday); } else if ("memo".equals(childNodeList.item(j).getNodeName())) { String memo = childNodeList.item(j).getFirstChild().getNodeValue(); Log.d(TAG, "memo =" + memo); students.setMemo(memo); } } } //添加到list中 list.add(students); } } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }