Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android之DOM解析XML

Android之DOM解析XML

編輯:關於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文件

 



(2)MainActivity.java

 

 

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'
}

(4)AndroidManifest.xml

 

 

  

Dom解析XMl過程:

 

\

\

其實就是用遞歸的方法對樹形結構XMl文檔進行讀取。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved