您的位置:首页 > 其它

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();
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: