編輯:關於Android編程
dom 我的理解就是先把整個文檔讀取到內存中,然後才解析,讀取大點的文件的話這樣效率就會很低。而 sax和pull 它們是基於事件解析的。一行一行去解析,效率會高點。
下面就講這三種的用法:
dom解析xml sax解析xml pull解析xml首先在main創建個assets目錄,創建好後,然後在這目錄下創建個person.xml文件

person.xml裡面的內容為:
張三 22通信工程 李四 32軟件工程 王五 29土木工程
接下來我們用三種方法就解析這個內容。掌握解析了這個,其他的基本上也會了。
activity_main.xml布局文件代碼如下:
很簡單就一個按鈕,還有一個是顯示解析出來的內容,
PersonBean.java代碼如下:
public class PersonBean {
private int id;
private String name;
private int age;
private String major;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
@Override
public String toString() {
return "PersonBean{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", major='" + major + '\'' +
'}';
}
}
ParseXMLForDom.java代碼如下:
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
/**
* Created by Administrator on 2016/10/4.
*/
public class ParseXMLForDom {
/**
* dom方式解析xml
*/
public static List parseXML(InputStream is) throws Exception {
//獲取集合實例
List list = new ArrayList<>();
//獲取DocumentBuilderFactory實例
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//獲取documentBuilder實例
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//獲取document實例
Document document = documentBuilder.parse(is);
//獲取person節點集合
NodeList personNodeList = document.getElementsByTagName("person");
for (int i = 0; i < personNodeList.getLength(); i++) {
PersonBean bean = new PersonBean();//獲取personbean實例
Node person = personNodeList.item(i);//獲取person節點
NamedNodeMap nnm = person.getAttributes();
/*
* 獲取person節點的屬性值
*/
for (int j = 0; j < nnm.getLength(); j++) {
Node n = nnm.item(j);
bean.setId(Integer.valueOf(n.getNodeValue()));
}
/*
獲取person裡的子節點,並賦值給bean
*/
NodeList personChildNodeList = person.getChildNodes();
for (int j = 0; j < personChildNodeList.getLength(); j++) {
//獲取person節點的子節點
Node personChileNode = personChildNodeList.item(j);
if (Node.ELEMENT_NODE == personChileNode.getNodeType()) {
if ("name".equals(personChileNode.getNodeName())) {
bean.setName(personChileNode.getTextContent().trim());
} else if ("age".equals(personChileNode.getNodeName())) {
bean.setAge(Integer.valueOf(personChileNode.getTextContent().trim()));
} else if ("major".equals(personChileNode.getNodeName())) {
bean.setMajor(personChileNode.getTextContent().trim());
}
}
}
list.add(bean);
}
return list;
}
}
這個是dom解析xml,
//獲取DocumentBuilderFactory實例
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//獲取documentBuilder實例
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//獲取document實例
Document document = documentBuilder.parse(is);
這幾步是必須要,我們要拿到整個document實例才能去解析。
MainActivity.java代碼如下:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView mContent;
private List list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidgets();//初始化控件
}
/**
* 為按鈕綁定點擊事件
*
* @param view
*/
public void parseXML(View view) {
parseXMLForDom();
}
/**
* dom解析xml
*/
private void parseXMLForDom() {
try {
list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).toString() + "\n");
}
mContent.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化控件
*/
private void initWidgets() {
mContent = (TextView) findViewById(R.id.content);
}
}
裡面邏輯不難。就不解釋了。。
運行結果:

再創建個MyHandler類繼承DefaultHandler ,代碼如下
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2016/10/4.
*/
public class MyHandler extends DefaultHandler {
private PersonBean bean;
private List list;
private String contentFlag;//只是一個標記,把值放到contentFlag中
/**
* 解析到文檔開始調用,一般做初始化操作
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
list=new ArrayList<>();//初始化list
super.startDocument();
}
/**
* 解析到文檔末尾調用,一般做回收操作
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
/**
* 每讀到一個元素就調用該方法
* @param uri
* @param localName
* @param qName
* @param attributes
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//當讀到person節點時就創建一個personbean實例
if ("person".equals(qName)){
bean=new PersonBean();
String id= attributes.getValue("id");
bean.setId(Integer.valueOf(id));
}
super.startElement(uri, localName, qName, attributes);
}
/**
* 讀到元素的結尾調用
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("person".equals(qName)){
list.add(bean);
bean=null;//通知jvm回收
}
if ("name".equals(qName)){
bean.setName(contentFlag);
}else if ("age".equals(qName)){
bean.setAge(Integer.valueOf(contentFlag));
}else if ("major".equals(qName)){
bean.setMajor(contentFlag);
}
contentFlag=null;//設為null
super.endElement(uri, localName, qName);
}
/**
* 讀到屬性內容調用
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
contentFlag=new String(ch,start,length).trim();
super.characters(ch, start, length);
}
/**
* 把list暴露出去,
* @return
*/
public List getList() {
return list;
}
}
改下MainActivity代碼如下:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import org.xml.sax.SAXException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MainActivity extends AppCompatActivity {
private TextView mContent;
private List list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidgets();//初始化控件
}
/**
* 為按鈕綁定點擊事件
*
* @param view
*/
public void parseXML(View view) {
// parseXMLForDom();//dom解析xml
parseForXMLForSax();//sax解析xml
}
/**
* dom解析xml
*/
private void parseXMLForDom() {
try {
list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).toString() + "\n");
}
mContent.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* sax解析xml
*/
public void parseForXMLForSax() {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = null;
try {
sp = spf.newSAXParser();
MyHandler handler = new MyHandler();
sp.parse(getResources().getAssets().open("person.xml"), handler);
list = handler.getList();//這是解析出來的內容放在list集合中
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).toString() + "\n");
}
mContent.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 初始化控件
*/
private void initWidgets() {
mContent = (TextView) findViewById(R.id.content);
}
}
運行結果是一樣的,不放出來了
sax解析大概調用方法的順序:

創建ParseXMLForPull類代碼如下:
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2016/10/4.
*/
public class ParseXMLForPull {
public static List parseXML(InputStream is) {
List list=null;
PersonBean bean=null;
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(is, "utf-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("person".equals(parser.getName())) {
bean = new PersonBean();
String id= parser.getAttributeValue(null,"id");
bean.setId(Integer.valueOf(id));
}
if (bean != null) {
if ("name".equals(parser.getName())) {
bean.setName(parser.nextText().trim());
} else if ("age".equals(parser.getName())) {
bean.setAge(Integer.valueOf(parser.nextText().trim()));
} else if ("major".equals(parser.getName())) {
bean.setMajor(parser.nextText().trim());
}
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName())){
list.add(bean);
bean=null;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
pull也是基於事件解析的,感覺跟sax解析xml差不多、
MainActivity.java代碼如下:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MainActivity extends AppCompatActivity {
private TextView mContent;
private List list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidgets();//初始化控件
}
/**
* 為按鈕綁定點擊事件
*
* @param view
*/
public void parseXML(View view) {
// parseXMLForDom();//dom解析xml
// parseForXMLForSax();//sax解析xml
parseXMLForPull();//pull解析xml
}
/**
* dom解析xml
*/
private void parseXMLForDom() {
try {
list = ParseXMLForDom.parseXML(getResources().getAssets().open("person.xml"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).toString() + "\n");
}
mContent.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* sax解析xml
*/
public void parseForXMLForSax() {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = null;
try {
sp = spf.newSAXParser();
MyHandler handler = new MyHandler();
sp.parse(getResources().getAssets().open("person.xml"), handler);
list = handler.getList();//這是解析出來的內容放在list集合中
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).toString() + "\n");
}
mContent.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* pull解析xml
*/
public void parseXMLForPull() {
try {
list= ParseXMLForPull.parseXML(getResources().getAssets().open("person.xml"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i).toString() + "\n");
}
mContent.setText(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 初始化控件
*/
private void initWidgets() {
mContent = (TextView) findViewById(R.id.content);
}
}
運行結果還是一樣的。不放出來了、
邊學邊寫,終於完成了。dom跟sax解析xml以前是學過的,pull解析xml以前沒接觸過,感覺也不是太難。哈哈。。pull解析xml沒寫什麼解釋,我感覺明白了sax解析xml,pull解析應該也會 了。
AndroidForBlog/tree/master/androidforparsexml">https://github.com/songshuilin/AndroidForBlog/tree/master/androidforparsexml
Android狀態欄微技巧,帶你真正理解沉浸式模式
記得之前有朋友在留言裡讓我寫一篇關於沉浸式狀態欄的文章,正巧我確實有這個打算,那麼本篇就給大家帶來一次沉浸式狀態欄的微技巧講解。其實說到沉浸式狀態欄這個名字我也是感到很無
Android源碼分析--Handler和Looper機制詳解
在Android系統中的應用程序,與Java的應用程序相同,都是靠消息驅動,簡單的說就是:有一個消息隊列,我們可以不斷的向這個消息隊列中添加消息,並從中取出消息,處理消息
發現----Android Demo
時間悄悄的走,轉眼來實習已經三個月了,三個月的時間,小編慢慢的成長著,從剛開始的電商項目到現在的車段子項目,小編在走過一個又一個項目的同時,走過了一個又一個戰勝自己的奇跡
Android中ListView下拉刷新的實現方法實例分析
本文實例講述了Android中ListView下拉刷新的實現方法。分享給大家供大家參考,具體如下:ListView中的下拉刷新是非常常見的,也是經常使用的,看到有很多同學