2025-03-25

 

接上一章,這一章我們介紹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  

        { 

            //通過Dom工廠方法建立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 i 

             

            return 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; 

 

    @Override 

    protected void onCreate(Bundle savedInstanceState) 

    { 

        // TODO Auto-generated method stub 

        super.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>中的key 

        String[] from = {"id", "status", "name", "tool", "number"}; 

        //list_item.xml中對應的控件ID 

        int[] 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的解析方法,希望各位同學們認真學習。

 

 

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

 

摘自:kangkangz4的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *