Android中xml格式文件的三种解析小DEMO:
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Xml;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.ldm.kotlin.R;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* 创建时间: 2018/12/28 0028
* 创建人:ldm
* 功能描述:
*/
public class XmlActivity extends Activity implements View.OnClickListener {
private Button pull_btn;
private Button dom_btn;
private Button sax_btn;
private TextView result_tv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xml_act_layout);
pull_btn = (Button) findViewById(R.id.pull_btn);
dom_btn = (Button) findViewById(R.id.dom_btn);
sax_btn = (Button) findViewById(R.id.sax_btn);
result_tv = (TextView) findViewById(R.id.result_tv);
pull_btn.setOnClickListener(this);
dom_btn.setOnClickListener(this);
sax_btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.pull_btn:
try {
List<ItMan> pullMen = parseXmlByPull();
result_tv.setText(pullMen.toString());
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.dom_btn:
try {
List<ItMan> domMen = parseXmlByDom();
result_tv.setText(domMen.toString());
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.sax_btn:
try {
List<ItMan> saxMen = parseXmlBySax();
result_tv.setText(saxMen.toString());
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
/**
* 创建时间: 2018/12/28 0028 13:46
* 作 者: ldm
* 描 述: PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是:
* 在PULL解析过程中,需要获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。
* PULL解析器小巧轻便,解析快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析XML时也是用PULL解析器。
* 参数说明:
*/
private List<ItMan> parseXmlByPull() throws Exception {
List<ItMan> list = null;
ItMan itMan = null;
//创建xmlPull解析器
XmlPullParser parser = Xml.newPullParser();
///初始化xmlPull解析器
parser.setInput(getAssets().open("worker.xml"), "utf-8");
//读取文件的类型
int type = parser.getEventType();
//无限判断文件类型进行读取
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
//开始标签
case XmlPullParser.START_TAG:
if ("worker".equals(parser.getName())) {
list = new ArrayList<>();
} else if ("itman".equals(parser.getName())) {
itMan = new ItMan();
} else if ("name".equals(parser.getName())) {
//获取name值
String name = parser.nextText();
itMan.setName(name);
} else if ("nickName".equals(parser.getName())) {
//获取nickName值
String nickName = parser.nextText();
itMan.setNickName(nickName);
} else if ("age".equals(parser.getName())) {
//获取age值
String age = parser.nextText();
itMan.setAge(Integer.parseInt(age));
} else if ("level".equals(parser.getName())) {
//获取level值
String level = parser.nextText();
itMan.setLevel(level);
}
break;
//结束标签
case XmlPullParser.END_TAG:
if ("itman".equals(parser.getName())) {
list.add(itMan);
}
break;
}
//继续读取标签类型
type = parser.next();
}
return list;
}
/**
* 创建时间: 2018/12/28 0028 13:49
* 作 者: ldm
* 描 述: DOM解析的原理是基于树形的结构和信息数据集合:
* 将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示
* 利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。
* 参数说明:
*/
private List<ItMan> parseXmlByDom() throws Exception {
//一系列的初始化
List<ItMan> itList = new ArrayList<>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
//获得Document对象
Document document = builder.parse(getAssets().open("worker.xml"));
//获得IT男的的List(本xml中就是根结点)
NodeList manList = document.getElementsByTagName("itman");
//遍历itman标签
for (int i = 0; i < manList.getLength(); i++) {
//获得itman标签
Node node_student = manList.item(i);
//获得itman标签里面的标签
NodeList childNodes = node_student.getChildNodes();
//新建对象
ItMan iteMan = new ItMan();
//遍历itman标签里面的标签
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
//判断是name还是nickName
if ("name".equals(childNode.getNodeName())) {
String name = childNode.getTextContent();
iteMan.setName(name);
} else if ("nickName".equals(childNode.getNodeName())) {
String nickName = childNode.getTextContent();
iteMan.setNickName(nickName);
} else if ("age".equals(childNode.getNodeName())) {
String age = childNode.getTextContent();
iteMan.setAge(Integer.parseInt(age));
} else if ("level".equals(childNode.getNodeName())) {
String level = childNode.getTextContent();
iteMan.setLevel(level);
}
}
//加到List中
itList.add(iteMan);
}
return itList;
}
/**
* 创建时间: 2018/12/28 0028 13:50
* 作 者: ldm
* 描 述: SAX解析核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的,也就是ContentHandler为重要核心。
* 解析过程中每遇到一个事件源,只有调用事件解析器才能得到相应的处理;不过它的优点主要是解析速度快,占用内存少。
* 非常适合在Android移动设备中使用
* 参数说明:
*/
private List<ItMan> parseXmlBySax() throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
//初始化Sax解析器
SAXParser sp = spf.newSAXParser();
//新建解析处理器
SaxparseHandler handler = new SaxparseHandler();
//将解析交给处理器
sp.parse(getAssets().open("worker.xml"), handler);
//返回List
return handler.getList();
}
public class SaxparseHandler extends DefaultHandler {
private List<ItMan> list;
private ItMan itMan;
//用于存储读取的临时变量
private String tempString;
/**
* 解析到文档开始
*/
@Override
public void startDocument() throws SAXException {
list = new ArrayList<>();
super.startDocument();
}
/**
* 解析到文档末尾调用
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
/**
* 每读到一个元素就调用
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if ("itman".equals(qName)) {
//读到student标签
itMan = new ItMan();
}
super.startElement(uri, localName, qName, attributes);
}
/**
* 读到元素的结尾时调用
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("itman".equals(qName)) {
list.add(itMan);
}
if ("name".equals(qName)) {
itMan.setName(tempString);
} else if ("nickName".equals(qName)) {
itMan.setNickName(tempString);
} else if ("age".equals(qName)) {
itMan.setAge(Integer.parseInt(tempString));
} else if ("level".equals(qName)) {
itMan.setLevel(tempString);
}
super.endElement(uri, localName, qName);
}
/**
* 读到属性内容调用
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
tempString = new String(ch, start, length);
super.characters(ch, start, length);
}
/**
* 获取该List并返回
*/
public List<ItMan> getList() {
return list;
}
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/pull_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="PULL解析"
android:textSize="14sp" />
<Button
android:id="@+id/dom_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="DOM解析"
android:textSize="14sp" />
<Button
android:id="@+id/sax_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="center"
android:text="SAX解析"
android:textSize="14sp" />
<TextView
android:id="@+id/result_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp" />
</LinearLayout>
实体类:
/**
* 创建时间: 2018/12/28 0028
* 创建人:ldm
* 功能描述:
*/
public class ItMan {
private String name;
private String nickName;
private int age;
private String level;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
@Override
public String toString() {
return "ItMan{" +
"name='" + name + '\'' +
", nickName='" + nickName + '\'' +
", age=" + age +
", level='" + level + '\'' +
'}';
}
}