DOM解析XML文件時,會將XML文件的全部內容讀取到內存中,而後使用DOM API遍歷XML數、檢索所須要的數據。使用DOM操做XML比較直觀,而且在某些方面比基於SAX的實現更加簡單。可是由於DOM須要將XML文件的全部內容讀取到內存,因此內存的消耗比較大,特別對於運行Android的移動設備來講,由於設備的資源比較寶貴,因此建議仍是採用SAX來解析XML文件,固然,若是XML的文件內容較小,採用DOM也是可行的。java
main.xmlandroid
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <!-- 添加一個按鈕 --> <Button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="GO!" /> <!-- 添加一個文本框,用於顯示結果 --> <TextView android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout>
DOMXMLActivity.javaapp
package com.supermario.domxml; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class DomXMLActivity extends Activity { // 新建一個按鈕用於響應用戶按鍵 private Button start; // 新建一個TextView用於存放結果 private TextView show; // Assets中的xml文件名稱 private String fileName = "fruit.xml"; InputStream inStream = null; /** 首次建立界面時運行 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); show = (TextView) findViewById(R.id.show); start = (Button) findViewById(R.id.start); try { // 從Assets中獲取文件 inStream = this.getAssets().open(fileName); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 爲按鍵綁定事件 start.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 用於存放結果字符串 String result = ""; // 解析字符流 result = parse(inStream); // 將結果顯示到界面上 show.setText(result); } }); } // 解析字符流 public String parse(InputStream inStream) { String result = ""; // 實例化一個DocumentBuilderFactory類 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; Document doc = null; try { // 實例化一個DocumentBuilder用於解析字符流 builder = dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { // 解析字符流 doc = builder.parse(inStream); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Element ele = doc.getDocumentElement(); // 獲取全部的「fruit」節點 NodeList nl = ele.getElementsByTagName("fruit"); if (nl != null && nl.getLength() != 0) { for (int i = 0; i < nl.getLength(); i++) { Element entry = (Element) nl.item(i); // 用於獲取屬性 result += "name:" + entry.getAttribute("name") + "-->"; // 用於獲取文本內容 result += entry.getTextContent() + "\n"; } } return result; } }
Fruit.xmldom
<?xml version="1.0" encoding="utf-8"?> <resources> <fruit id="1" name="apple"> <fruit id="01" name="grap">10yuan</fruit> </fruit> <fruit id="2" name="banana">3yuan </fruit> <fruit id="3" name="pear" /> </resources>
輸出結果:ide
name:apple-->
10yuan
name:grap-->10yuan
name:banana-->3yuan
name:pear--> ui