編輯:關於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類是為了實現View平滑滾動的一個Helper類。通常在自定義的View時使用,在View中定義一個私有成員mScroller =
一、測試性能Demo 首先給大家一個性能測試的Demo,看看性能如何。 Demo.apk 二、相關操作CRUD Entity: import android.an
如何在圖片上畫畫呢?這裡寫了一個demo,供大家參考一、先看一眼工程結構工程結構:二、自定義view這個自定義view實現了保留軌跡的功能,代碼如下package pic
Android布局管理器Android的Activity組件通過setContentView(xml resId) 來為activity綁定顯示界面,然而為了更好的更方便