Android數據解析 :XML
什么是可擴展標記語言?
-
可擴展標記語言是一種很像 超文本標記語言 的標記語言
-
它的設計宗旨是 傳輸數據 ,而不是 顯示數據
-
它的標簽沒有被預定義。您需要自行定義標簽
-
它被設計為具有自我描述性
-
它是W3C的推薦標準
Android中解析XML數據的三種方式 :
-
SAX解析
(Simple API for XML)事件驅動,解析速度快,占用內存少 -
DOM解析
文檔對象模型(Document Object Model)將xml文件全部載入,組裝成一顆dom樹,然后通過節點以及節點之間的關系來解析xml文件 -
PULL解析
事件驅動, 在解析過程中, 我們需要自己獲取產生的事件然后做相應的操作. Android系統內部在解析各種XML時是用PULL解析器
效果展示

xml.gif
代碼
準備工作
-
users.xml(要解析的xml文件)
目錄結構
目錄結構

Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>保羅</name>
<age>10</age>
<sex>男</sex>
</user>
<user id="2">
<name>金寶</name>
<age>30</age>
<sex>男</sex>
</user>
<user id="3">
<name>缺心</name>
<age>18</age>
<sex>女</sex>
</user>
</users>
-
User.java類
( 略 )
-
定義一個接口IUserParser.java
package com.lyp.xml;
import java.io.InputStream;
import java.util.List;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public interface IUserParser {
//解析輸入流 得到User對象集合
List<User> parse(InputStream is) throws Exception;
}
界面布局文件
- activty_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<Button
android:id="@+id/btn_sax"
android:text="SAXParser"
android:textSize="25sp"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_dom"
android:text="DOMParser"
android:textSize="25sp"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_pull"
android:text="PULLParser"
android:textSize="25sp"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv_show"
android:textSize="25sp"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
開始定義實現IUserParser接口的解析類
方式一. SAX解析
package com.lyp.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public class UserSaxParser implements IUserParser {
@Override
public List<User> parse(InputStream is) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance(); //取得SAXParserFactory實例
SAXParser parser = factory.newSAXParser(); //從factory獲取SAXParser實例
MyHandler handler = new MyHandler(); //實例化自定義Handler
parser.parse(is, handler); //根據自定義Handler規則解析輸入流
return handler.getUsers();
}
//需要重寫DefaultHandler的方法
private class MyHandler extends DefaultHandler {
private List<User> users;
private User user;
private StringBuilder builder;
//返回解析后得到的User對象集合
public List<User> getUsers() {
return users;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
users = new ArrayList<User>();
builder = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (localName.equals("user")) {
user = new User();
}
builder.setLength(0); //將字符長度設置為0 以便重新開始讀取元素內的字符節點
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
builder.append(ch, start, length); //將讀取的字符數組追加到builder中
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (localName.equals("id")) {
user.setId(Long.parseLong(builder.toString()));
} else if (localName.equals("name")) {
user.setName(builder.toString());
} else if (localName.equals("age")) {
user.setAge(Integer.parseInt(builder.toString()));
} else if (localName.equals("sex")) {
user.setSex(builder.toString());
} else if (localName.equals("user")) {
users.add(user);
}
}
}
}
方式二. DOM解析
package com.lyp.xml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
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 ${思格斯} on 2016/9/22 0022.
*/
public class UserDomParser implements IUserParser {
private List<User> mUsers;
@Override
public List<User> parse(InputStream is) throws Exception {
mUsers = new ArrayList<User>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//取得DocumentBuilderFactory實例
DocumentBuilder builder = factory.newDocumentBuilder(); //從factory獲取DocumentBuilder實例
Document doc = builder.parse(is); //解析輸入流,得到Document實例
Element rootElement = doc.getDocumentElement(); //獲取根節點users
NodeList items = rootElement.getElementsByTagName("user"); //獲取子節點user的集合
for (int i = 0; i < items.getLength(); i++) {
User user = new User();
Node item = items.item(i); //獲取各個user節點
NodeList properties = item.getChildNodes(); //獲取user節點下的各個子節點的集合
for (int j = 0; j < properties.getLength(); j++) {
Node property = properties.item(j); //獲取各個子節點
String nodeName = property.getNodeName(); //獲取各個子節點的名字
if (nodeName.equals("id")) {
user.setId(Long.parseLong(property.getFirstChild().getNodeValue()));
} else if (nodeName.equals("name")) {
user.setName(property.getFirstChild().getNodeValue());
} else if (nodeName.equals("age")) {
user.setAge(Integer.parseInt(property.getFirstChild().getNodeValue()));
} else if (nodeName.equals("sex")) {
user.setSex(property.getFirstChild().getNodeValue());
}
}
mUsers.add(user);
}
return mUsers;
}
}
方式三. PULL解析
package com.lyp.xml;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public class UserPullParser implements IUserParser{
@Override
public List<User> parse(InputStream is) throws Exception {
List<User> users = null;
User user = null;
// XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// XmlPullParser parser = factory.newPullParser();
XmlPullParser parser = Xml.newPullParser(); //由android.util.Xml創建一個XmlPullParser實例
parser.setInput(is, "UTF-8"); //設置輸入流 并指明編碼方式
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
users = new ArrayList<User>();
break;
case XmlPullParser.START_TAG:
if (parser.getName().equals("user")) {
user = new User();
} else if (parser.getName().equals("id")) {
eventType = parser.next();
if (user != null) {
user.setId(Long.parseLong(parser.getText()));
}
} else if (parser.getName().equals("name")) {
eventType = parser.next();
if (user != null) {
user.setName(parser.getText());
}
} else if (parser.getName().equals("age")) {
eventType = parser.next();
if (user != null) {
user.setAge(Integer.parseInt(parser.getText()));
}
} else if (parser.getName().equals("sex")) {
eventType = parser.next();
if (user != null) {
user.setSex(parser.getText());
}
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("user")) {
if (users != null) {
users.add(user);
}
user = null;
}
break;
}
eventType = parser.next();
}
return users;
}
}
MainActivty.java
package com.lyp.xml;
import android.content.res.XmlResourceParser;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btnSax;
private Button btnDom;
private Button btnPull;
private TextView tvShow;
private List<User> userList;
private StringBuilder mBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mBuilder=new StringBuilder();
}
private void initView() {
btnSax= (Button) findViewById(R.id.btn_sax);
btnDom= (Button) findViewById(R.id.btn_dom);
btnPull= (Button) findViewById(R.id.btn_pull);
tvShow= (TextView) findViewById(R.id.tv_show);
btnSax.setOnClickListener(this);
btnDom.setOnClickListener(this);
btnPull.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
//case R.id.btn_sax:
//case R.id.btn_dom:
case R.id.btn_pull:
try {
//獲取assets目錄下的xml文件輸入流
InputStream inputStream = getAssets().open("users.xml");
//Sax解析
//UserSaxParser saxParser = new UserSaxParser();
//userList = saxParser.parse(inputStream);
//Dom解析
//UserDomParser domParser = new UserDomParser();
//userList = domParser.parse(inputStream);
//Pull解析
UserPullParser pullParser = new UserPullParser();
userList = pullParser.parse(inputStream);
//將user集合中的數據讀取出來
for (int i=0;i<userList.size();i++){
User user=userList.get(i);
long id= user.getId();
String name=user.getName();
int age=user.getAge();
String sex=user.getSex();
mBuilder.append("id:"+id +" name:"+name +" age:"+age +" sex:"+sex +"\r\n");
}
//將數據顯示到TextView
tvShow.setText(mBuilder);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
來自:http://www.jianshu.com/p/00340117ff25
本文由用戶 jimmychen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!