編輯:關於Android編程
DOM方式解析XML是先把XML文檔都讀到內存中,然後再用DOM API來訪問樹形結構,並獲取數據的。如果XML文件很大的時候,處理效率就會變的很低。
用DOM解析的具體思路是:
1.將XML文件加載進來。
2.獲取文檔的根節點。
3.獲取文檔根節點中所有子節點的列表。
4.獲取子節點列表中需要讀取的信息。
插曲:補充一些DOM API的知識,有助於大家理解(其實和JS裡找元素節點一樣):
nodeName 某個節點的名稱。
元素節點的 nodeName 是元素名稱
屬性節點的 nodeName 是屬性名稱
文本節點的 nodeName 永遠是 #text
文檔節點的 nodeName 永遠是 #document
nodeValue 節點裡的值
對於文本節點,nodeValue 屬性包含文本。
對於屬性節點,nodeValue 屬性包含屬性值。
nodeType 屬性可返回節點的類型
元素element返回1
屬性attr 返回2
文本text返回3
注釋comments返回8
文檔document 返回9
Demo:
服務放的XML數據:

這裡我是用自己電腦上的Tomcat搭建的服務器,文件存放地址:TomCat安裝目錄/Tomcat7.0/webapps/ROOT/get_data.xml.
實現效果:

(1)activity_main.xml文件
package com.example.xmlanddom;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
public final static String TAG = "XMLParseDom";
private TextView response_text;
private StringBuilder msg=new StringBuilder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
response_text = (TextView) this.findViewById(R.id.response_text);
}
public void click(View v) {
sendRequestWithHttpURLConnection();
}
/**
* 開啟線程向服務器讀取數據
*/
public void sendRequestWithHttpURLConnection() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://10.0.2.2:8080/get_data.xml")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseXMLWithDOM(responseData.trim());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
public void parseXMLWithDOM(String xmlData) {
try {
//創建DOM工廠對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通過DOM工廠創建DocumentBuilder
DocumentBuilder builder = factory.newDocumentBuilder();
//將數據轉換成InputStream
InputStream is = new ByteArrayInputStream(xmlData.getBytes());
//把輸入流轉換成DOM對象
Document document = builder.parse(is);
//獲取根節點
Element root = document.getDocumentElement();
//解析XML文件
parse(root);
showResponseToUI(msg.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 用Document方法解析XML
*
* @param element 將要進行遍歷的節點
*/
private void parse(Element element) {
String id = "";
String name = "";
String version = "";
//得到element元素的所有子元素
NodeList nodeList = element.getChildNodes();
int size = nodeList.getLength();
for (int i = 0; i < size; i++) {
//獲取特定位置的node
Node element2 = (Node) nodeList.item(i);
//得到element2節點的名稱
String tagName = element2.getNodeName();
Log.i(TAG, "節點的類型為:" + element2.getNodeType() + ",節點的名字為:" + tagName);
if (tagName.equals("app") && element2.getNodeType() == Document.ELEMENT_NODE) {
if (element2.getNodeType() == Document.ELEMENT_NODE) {
//如果element2還有子節點,遞歸解析子節點
parse((Element) element2);
}
}
if (tagName.equals("id")) {
id = element2.getTextContent();
Log.i(TAG, id);
}
if (tagName.equals("name")) {
name = element2.getTextContent();
Log.i(TAG, name);
}
if (tagName.equals("version")) {
version = element2.getTextContent();
Log.i(TAG, version);
}
}
if(id!=""&&name!=""&&version!="") {
msg.append("id=" + id + ",name=" + name + ",version=" + version + ";\n");
}
Log.i(TAG, id + name + version);
}
private void showResponseToUI(final String response){
runOnUiThread(new Runnable() {
@Override
public void run() {
//在這裡進行UI操作,將結果顯示到界面上
response_text.setText(response);
}
});
}
}
(3)build.gradle
網絡請求用的是OKHttp,所以要在gradle中加入依賴。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
}


其實就是用遞歸的方法對樹形結構XMl文檔進行讀取。
Android學習之 Scroller的介紹與使用
類概述Android裡Scroller類是為了實現View平滑滾動的一個Helper類。通常在自定義的View時使用,在View中定義一個私有成員mScroller =
android 超輕量級的ORM框架
一、測試性能Demo 首先給大家一個性能測試的Demo,看看性能如何。 Demo.apk 二、相關操作CRUD Entity: import android.an
Android簡單實現畫圖功能
如何在圖片上畫畫呢?這裡寫了一個demo,供大家參考一、先看一眼工程結構工程結構:二、自定義view這個自定義view實現了保留軌跡的功能,代碼如下package pic
學習Android從0開始之基礎篇(3)-視圖組件之布局管理器
Android布局管理器Android的Activity組件通過setContentView(xml resId) 來為activity綁定顯示界面,然而為了更好的更方便