xml解析pull sax dom
2017-04-19 08:35
232 查看
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中
1091d
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();
}
}
}
}
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中
1091d
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();
}
}
}
}
相关文章推荐
- DOM PULL SAX 三种方式解析XML
- 使用PHP DOM-XML创建和解析XML文件
- 使用PHP DOM-XML创建和解析XML文件
- DOM解析XML(转)
- java中用dom解析xml的经典入门级文档
- 比较经典的DOM解析XML范例讲解
- dom解析 xml
- 在JavaScript中使用DOM解析XML数据
- xml文件解析-DOM
- Java解析XML文档——dom解析xml
- java DOM解析XML(2) 树
- 使用PHP DOM-XML创建和解析XML文件
- XML基本概念解析(一) SAX、DOM、DTD和Schema
- 用DOM/JDOM解析XML文件
- XML(一) DOM解析XML文档实例一
- 解析xml之--DOM
- Java解析XML文档——dom解析xml
- dom解析xml
- sax和Dom解析xml文档 文档驱动和事件驱动
- DOM 解析 XML 文档