Android之DOM解析XML,androiddomxml

來源:互聯網
上載者:User

Android之DOM解析XML,androiddomxml
一.DOM解析方法介紹

  DOM是基於樹形結構的節點或資訊片段的集合,允許開發人員使用DOM API遍曆XML樹,檢索所需資料。分析該結構通常需要載入整個文檔和構造樹形結構,然後才可以檢索和更新節點資訊。

  Android完全支援DOM解析。利用DOM中的對象可以對XML文檔進行讀取、搜尋、修改、添加和刪除等操作。

  DOM的工作原理:使用DOM對XML檔案進行操作時,首先要解析檔案,將檔案分為獨立的元素、樹形和注釋等,然後以節點樹的形式在記憶體中對XML檔案進行表示,就可以通過節點樹訪問文檔的內容,並根據需要修改文檔—這就是DOM的工作原理。

  DOM實現時首先為XML文檔的解析定義一組介面,解析器讀入整個文檔,然後構造一個駐留記憶體的樹結構這樣代碼就可以使用DOM介面來操作整個樹結構。

  由於DOM在記憶體中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文檔,解析和載入整個文檔就回很耗資源。當然,如果XML文檔的內容比較小,採用DOM是可行的。

  XML基本的節點類型:

    node---DOM基本的資料類型

    Element---最主要的處理的對象是Element

    Attr---元素的屬性

    Text---一個Element或者Attr的實際內容

    Document---一個代表整個XML文檔,一個Document對象通常也稱為一個樹。

  優點:整個文檔讀入記憶體,方便操作,支援修改、刪除和重新排列等多種功能。

  缺點: 將整個文檔讀入記憶體中,保留了過多的不需要的節點,浪費記憶體和空間。

  使用場合: 一旦讀入文檔,還需要多次對文檔進行操作,並且在硬體資源充足的情況下(記憶體、CPU)。

二、DOM解析步驟         1. 首先利用DocumentBuilderFactory建立一個DocumentBuilderFactory執行個體。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         2. 利用DocumentBuilderFactory建立DocumentBuilder。
DocumentBuilder builder = factory.newDocumentBuilder();
         3. 載入XML文檔。
Document dom = builder.parse(inputStream);
         4. 擷取文檔的根節點(Element)
 Element root = dom.getDocumentElement();
         5. 擷取根節點中的所有子節點的列表(NodeList)
 NodeList items = root.getElementsByTagName("person");
         6. 然後再擷取子節點列表中的需要讀取的節點。

 

//所有子節點
for (int i = 0; i < items.getLength(); i++) { //得到一個Person節點 Element personNode = (Element) items.item(i); //擷取Person節點下的所有子節點(標籤之間的空白節點和name/age元素) NodeList childNodes = personNode.getChildNodes();
   //子節點 for (int j = 0; j < childNodes.getLength(); j++) { Node node = childNodes.item(j);
     //判斷是否為元素類型 if (node.getNodeType() == Node.ELEMENT_NODE) { Element childNode = (Element) node; ... } }}
三、DOM解析XML代碼1.建立一個XML檔案itcase.xml,並將其放在res/raw檔案夾下。
<?xml version="1.0" encoding="UTF-8"?><persons>    <person id="23">        <name>liming</name>        <age>30</age>    </person>    <person id="20">        <name>lixiangmei</name>        <age>25</age>    </person></persons>

如果沒有raw檔案夾,就在res檔案夾下建立一個raw檔案夾,並建立xml檔案。

2.修改視圖
 <Button        android:id="@+id/dom_button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_marginTop="@dimen/fab_margin"        android:gravity="center_horizontal"        android:text="@string/DOM" /><TextView        android:id="@+id/text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Hello World!" />
3.添加AnalyzeDOM類
package com.zhangmiao.analyzexmldemo;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 zhangmiao on 2016/12/14. */public class AnalyzeDOM {    public static List<Person> readXML(InputStream inputStream) {        List<Person> persons = new ArrayList<>();        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        try {            DocumentBuilder builder = factory.newDocumentBuilder();            Document dom = builder.parse(inputStream);            Element root = dom.getDocumentElement();            NodeList items = root.getElementsByTagName("person");            for (int i = 0; i < items.getLength(); i++) {                Person person = new Person();                Element personNode = (Element) items.item(i);                person.setId(new Integer(personNode.getAttribute("id")));                NodeList childNodes = personNode.getChildNodes();                for (int j = 0; j < childNodes.getLength(); j++) {                    Node node = childNodes.item(j);                    if (node.getNodeType() == Node.ELEMENT_NODE) {                        Element childNode = (Element) node;                        if ("name".equals(childNode.getNodeName())) {                            person.setName(childNode.getFirstChild().getNodeValue());                        } else if ("age".equals(childNode.getNodeName())) {                            person.setAge(new Short(childNode.getFirstChild().getNodeValue()));                        }                    }                }                persons.add(person);            }            inputStream.close();        } catch (Exception e) {            e.printStackTrace();        }        return persons;    }}
4.修改MainActivity類
package com.zhangmiao.analyzexmldemo;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.view.Menu;import android.view.MenuItem;import android.widget.Button;import android.widget.TextView;import org.xml.sax.InputSource;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStreamWriter;import java.io.StringWriter;import java.util.List;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private static final String TAG = "AnalyzeXMLDemo";    private TextView mTextView;    private InputStream inputStream;    @Override    protected void onCreate(Bundle savedInstanceState) {        Log.v(TAG, "onCreate");        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                        .setAction("Action", null).show();            }        });        Button domButton = (Button) findViewById(R.id.dom_button);        mTextView = (TextView) findViewById(R.id.text);        domButton.setOnClickListener(this);    }    @Override    public void onClick(View v) {        String result = "";        inputStream = getResources().openRawResource(R.raw.itcase);        switch (v.getId()) {case R.id.dom_button:                result += "--------- DOM ---------" + "\n";                if (inputStream == null) {                    result = "inputStream is null";                } else {                    List<Person> personList = AnalyzeDOM.readXML(inputStream);                    if (personList != null) {                        for (int i = 0; i < personList.size(); i++) {                            String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()                                    + " , age = " + personList.get(i).getAge() + ".\n";                            result += message;                        }                    }                }                mTextView.setText(result);                break;default:                break;        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        //noinspection SimplifiableIfStatement        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}

參考文章:

http://www.open-open.com/lib/view/open1392780226397.html

http://www.cnblogs.com/weixing/archive/2013/08/07/3243366.html

http://www.tuicool.com/articles/IvQvyq

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.