Android XML文檔解析(二)——DOM解析

來源:互聯網
上載者:User

------------------------------------------------------------------------------------------------------

                   

 

        

    

 (1)元素:Element
   元素是XML的基本構件。元素的子節點可以是其它元素、文本節點或兩者都有。元素節點還可以只含有屬性這一唯一類型的節點。
 (2)屬性:Attr
   屬性節點包含關於元素節點的資訊,代表某個元素的屬性,雖然Attr繼承自Node介面,但因為Attr是包含在Element中的,但並不能將其看做是Element的子物件,分
 (3)文本:Text
   文本節點文本資訊,或乾脆是空白的文本。
 (4)文檔:Document
   文檔節點是整個文檔中所有其它節點的父節點

 

方法摘要
 int getLength()
          列表中的節點數。
 Node item(int index)
          返回集合中的第 index 個項。

 

 

 

(一)第一步:建立一個工廠類DocumentBuilderFactory,這一點和SAX類似。工廠類也是單例模式,沒有提供共有的建構函式,需要使用靜態newInstance()方法獲得。

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

(二)第二步:利用工廠類執行個體建立DocumentBuilder對象

DocumentBuilder builder =factory.newDocumentBuilder();

(三)第三步:解析該檔案以建立Document對象

Document document = builder.parse(is);


 

三.SAX解析執行個體

(一)下面以一個工程執行個體來實現SAX對XML檔案的解析。仍然以上前面介紹的《Android XML文檔解析(一)——SAX解析》中的laolu_xml.xml檔案為例子。

<?xml version="1.0"  encoding="UTF-8"?><persons>    <person id="0">        <name>劉德華</name>        <sex>男</sex>        <age>21</age>    </person>    <person id="1">        <name>張漫玉</name>        <sex>女</sex>        <age>22</age>    </person>    <person id="2">        <name>張易謀</name>        <sex>男</sex>        <age>23</age>    </person>    <person id="3">        <name>周新馳</name>        <sex>未知</sex>        <age>24</age>    </person>    <person id="4">        <name>納蘭容若</name>        <sex>男</sex>        <age>25</age>    </person></persons>



(二)先看一下DOM解析XML的實際,其效果跟SAX解析是一樣的。

(三)工程源碼架構

(1)布局檔案main_xml.xml  listview_xml.xml和適配器類MySimpleAdapter都和上篇文章一樣,這裡就不再給出代碼

(2)DOMParseService.java  (核心代碼)

package com.laolu.parser;import java.io.InputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import android.util.Log;public class DOMParserService {public List<Map<String,Object>> getPersons(InputStream is) throws Exception{List<Map<String,Object>> persons=new ArrayList<Map<String,Object>>();DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();DocumentBuilder builder =factory.newDocumentBuilder();Document document = builder.parse(is);Element root =document.getDocumentElement();NodeList personNodes=root.getElementsByTagName("person");for(int i=0;i<personNodes.getLength();i++){Map<String,Object> person =new HashMap<String,Object>();Element personElement =(Element) personNodes.item(i);String id=personElement.getAttribute("id");person.put("id", id);NodeList childNodes =personElement.getChildNodes();for(int j=0; j<childNodes.getLength();j++){if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE)//判斷是否為元素{if("name".equals(childNodes.item(j).getNodeName().trim())){ String name=childNodes.item(j).getFirstChild().getNodeValue();person.put("name", name);}else if("sex".equals(childNodes.item(j).getNodeName().trim())) {String sex=childNodes.item(j).getFirstChild().getNodeValue();person.put("sex", sex);}else if("age".equals(childNodes.item(j).getNodeName().trim())){String age=childNodes.item(j).getFirstChild().getNodeValue();person.put("age", age);} } }persons.add(person);} is.close();return persons;}}

 

package com.laolu.main;import java.io.InputStream;import java.util.List;import java.util.Map;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import com.example.xml.R;import com.laolu.adapter.MySimpleAdapter;import com.laolu.parser.DOMParserService;import com.laolu.parser.SAXForHandler;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;public class XML_ParseActivity extends Activity{private static final String SAX="SAX_Parse";private static final String DOM="DOM_Parse";private static final String PULL="Pull_Parse";ListView listView=null;InputStream inputStream=null;SimpleAdapter adapter=null;List<Map<String,Object>> persons=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_xml);listView=(ListView) findViewById(R.id.listview);Button saxButton=(Button) findViewById(R.id.sax_btn);Button domButton=(Button) findViewById(R.id.dom_btn);Button pullButton=(Button) findViewById(R.id.pull_btn);saxButton.setOnClickListener(new MyListener());domButton.setOnClickListener(new MyListener());pullButton.setOnClickListener(new MyListener());//通過類裝載器將XML資源載入成java能處理的IO流inputStream = this.getClass().getClassLoader().getResourceAsStream("laolu_xml.xml");}public class MyListener implements OnClickListener{@Overridepublic void onClick(View v){switch (v.getId()){case R.id.sax_btn:break;case R.id.dom_btn:try {updateListViewByDOM();} catch (Exception e) {Log.i(DOM, "DOM Exception!!!"); }break;case R.id.pull_btn:  break;}}}public void updateListViewBySAX() throws Exception  //SAX方式 {SAXForHandler saxForHandler = new SAXForHandler();SAXParserFactory spf = SAXParserFactory.newInstance();SAXParser saxParser = spf.newSAXParser();saxParser.parse(inputStream, saxForHandler);    persons = saxForHandler.getPersons();adapter=new MySimpleAdapter(this, persons, R.layout.listview_xml,      new String[]{"id","name","sex","age"}, new int[]{R.id.id,R.id.name,R.id.sex,R.id.age});listView.setAdapter(adapter);inputStream.close();}public void updateListViewByDOM() throws Exception //DOM方式{DOMParserService domParserService=new DOMParserService();persons=domParserService.getPersons(inputStream);adapter= new MySimpleAdapter(this, persons, R.layout.listview_xml, new String[]{"id","name","sex","age"}, new int[]{R.id.id,R.id.name,R.id.sex,R.id.age});listView.setAdapter(adapter);inputStream.close();  }}


 


 


 


 

 

 


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.