Android[中級教程]第七章 XML解析之Dom解析器

來源:互聯網
上載者:User

接上一章,這一章我們介紹Dom解析,因為Dom是J2EE中用得比較多的解析器,這裡解析方法跟J2EE方法是一樣的,具體的樣式跟以下這篇文章中的樣式是一樣的

<?xml version="1.0" encoding="UTF-8"?><persons><person id = "1"><status>大徙弟</status><name>孫悟空</name><tool>金箍棒</tool><number>殺死了50隻妖怪</number></person><person id = "2"><status>二徙弟</status><name>豬八戒</name><tool>九齒釘耙 </tool><number>殺死了40隻妖怪</number></person><person id = "3"><status>三徙弟</status><name>沙和尚</name><tool>降妖寶杖</tool><number>殺死了30隻妖怪</number></person></persons>
其他資料或樣式請看以下教程Android[中級教程]第五章 XML解析之PULL解析器

 我們來看解析處的代碼:

import java.io.InputStream;import java.util.ArrayList;import java.util.List;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;public class DomHandler{private InputStream input;private List<Person> persons;private Person person;public DomHandler(){}public DomHandler(InputStream input){this.input = input;}public void setInput(InputStream input){this.input = input;}public List<Person> getPersons(){persons = new ArrayList<Person>();try{//通過DomFactory 方法建立Dom解析器DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder();Document document = builder.parse(input);Element element = document.getDocumentElement();//取得節點<person>的節點列表NodeList personNodes =element.getElementsByTagName("person");//節點長度int length = personNodes.getLength();for(int i = 0; i < length; i++){//取得<person>的節點元素Element personElement = (Element)personNodes.item(i);person = new Person();//取得<person id="1">中的id屬性值person.setId(personElement.getAttribute("id"));//繼續向下,取得子節點列表,如<status><name>等等NodeList childnodes = personElement.getChildNodes();int len = childnodes.getLength();for(int j = 0 ; j < len ; j++){//如果子節點是一個元素節點if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){//取得節點名稱String nodeName = childnodes.item(j).getNodeName();//取得節點值String nodeValue = childnodes.item(j).getFirstChild().getNodeValue();if("status".equals(nodeName)){person.setStatus(nodeValue);}if("name".equals(nodeName)){person.setName(nodeValue);}if("tool".equals(nodeName)){person.setTool(nodeValue);}if("number".equals(nodeName)){person.setNumber(nodeValue);}}}//end for j   persons.add(person);}//end for ireturn persons;} catch (Exception e){e.printStackTrace();}return null;}}

接著就是Activity的代碼了:

import java.io.File;import java.io.FileInputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.widget.ListView;import android.widget.SimpleAdapter;public class PullActivity extends Activity{private ListView listView;private SimpleAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.xml_handler);listView = (ListView)findViewById(R.id.xml_list);try{//自完義適配方法getAdapter();} catch (Exception e){e.printStackTrace();}listView.setAdapter(adapter);}//自訂適配方法private void getAdapter() throws Exception{List<Map<String, String>> lists = new ArrayList<Map<String, String>>();//這一部分就是剛才我們做測試用的部分File SD_Files = Environment.getExternalStorageDirectory();String file_path = SD_Files.getName() + File.separator + "persons.xml";//PULL解析文檔//FileInputStream input = new FileInputStream(new File(file_path));//PullHandler pullHandler = new PullHandler(input);//List<Person> persons = pullHandler.getPersons();//SAX解析文檔//FileInputStream fis = new FileInputStream(new File(file_path));//SAXParser parser = SAXParserFactory.newInstance().newSAXParser();//SaxHandler saxHandler = new SaxHandler();//parser.parse(fis, saxHandler);//List<Person> persons = saxHandler.getPersons();//Dom解析文檔FileInputStream fis = new FileInputStream(new File(file_path));DomHandler domHandler = new DomHandler(fis);List<Person> persons = domHandler.getPersons();//將persons中的資料轉換到ArrayList<Map<String, String>>中,因為SimpleAdapter要用這個類型的資料進行適配Map<String, String> map;for(Person p : persons){map = new HashMap<String, String>();map.put("id", p.getId());map.put("status", p.getStatus());map.put("name", p.getName());map.put("tool", p.getTool());map.put("number", p.getNumber());lists.add(map);}//HashMap<String, String>中的keyString[] from = {"id", "status", "name", "tool", "number"};//list_item.xml中對應的控制項IDint[] to = {R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number};adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to);}}

其實Dom有Android中還是用的比較少的,主要是考慮效能的問題,畢竟手機不比伺服器或電腦啊。

下一章,我們將會介紹Json的解析方法,希望各位同學們認真學習。

呵呵,十月長假很快就結束了,又要努力工作和學習了。謝謝
 

 

聯繫我們

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