------------------------------------------------------------------------------------------------------
(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(); }}