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

 

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

分类: Android中级   116人阅读  评论(0)  收藏  举报

接上一章,这一章我们介绍Dom解析,因为Dom是J2EE中用得比较多的解析器,这里解析方法跟J2EE方法是一样的,具体的样式跟以下这篇文章中的样式是一样的

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persons>  
  3.     <person id = "1">  
  4.         <status>大徙弟</status>  
  5.         <name>孙悟空</name>  
  6.         <tool>金箍棒</tool>  
  7.         <number>杀死了50只妖怪</number>  
  8.     </person>  
  9.       
  10.     <person id = "2">  
  11.         <status>二徙弟</status>  
  12.         <name>猪八戒</name>  
  13.         <tool>九齿钉耙 </tool>  
  14.         <number>杀死了40只妖怪</number>  
  15.     </person>  
  16.       
  17.     <person id = "3">  
  18.         <status>三徙弟</status>  
  19.         <name>沙和尚</name>  
  20.         <tool>降妖宝杖</tool>  
  21.         <number>杀死了30只妖怪</number>  
  22.     </person>  
  23.   
  24. </persons>  

其他数据或样式请看以下教程

Android[中级教程]第五章 XML解析之PULL解析器

 我们来看解析处的代码:

  1. import java.io.InputStream;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4.   
  5. import javax.xml.parsers.DocumentBuilder;  
  6. import javax.xml.parsers.DocumentBuilderFactory;  
  7.   
  8. import org.w3c.dom.Document;  
  9. import org.w3c.dom.Element;  
  10. import org.w3c.dom.Node;  
  11. import org.w3c.dom.NodeList;  
  12.   
  13. public class DomHandler  
  14. {  
  15.     private InputStream input;  
  16.     private List<Person> persons;  
  17.     private Person person;  
  18.       
  19.     public DomHandler()  
  20.     {  
  21.     }  
  22.       
  23.     public DomHandler(InputStream input)  
  24.     {  
  25.         this.input = input;  
  26.     }  
  27.   
  28.     public void setInput(InputStream input)  
  29.     {  
  30.         this.input = input;  
  31.     }  
  32.       
  33.     public List<Person> getPersons(){  
  34.           
  35.         persons = new ArrayList<Person>();  
  36.         try  
  37.         {  
  38.             //通过Dom工厂方法建立Dom解析器  
  39.             DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder();  
  40.             Document document = builder.parse(input);  
  41.             Element element = document.getDocumentElement();  
  42.               
  43.             //取得节点<person>的节点列表  
  44.             NodeList personNodes =element.getElementsByTagName("person");  
  45.             //节点长度  
  46.             int length = personNodes.getLength();  
  47.             for(int i = 0; i < length; i++){  
  48.                 //取得<person>的节点元素  
  49.                 Element personElement = (Element)personNodes.item(i);  
  50.                 person = new Person();  
  51.                 //取得<person id="1">中的id属性值  
  52.                 person.setId(personElement.getAttribute("id"));  
  53.                   
  54.                 //继续向下,取得子节点列表,如<status><name>等等  
  55.                 NodeList childnodes = personElement.getChildNodes();  
  56.                 int len = childnodes.getLength();  
  57.                 for(int j = 0 ; j < len ; j++){  
  58.                     //如果子节点是一个元素节点  
  59.                     if(childnodes.item(j).getNodeType() == Node.ELEMENT_NODE){  
  60.                         //取得节点名称  
  61.                         String nodeName = childnodes.item(j).getNodeName();  
  62.                         //取得节点值  
  63.                         String nodeValue = childnodes.item(j).getFirstChild().getNodeValue();  
  64.                         if("status".equals(nodeName)){  
  65.                             person.setStatus(nodeValue);  
  66.                         }  
  67.                         if("name".equals(nodeName)){  
  68.                             person.setName(nodeValue);  
  69.                         }  
  70.                         if("tool".equals(nodeName)){  
  71.                             person.setTool(nodeValue);  
  72.                         }  
  73.                         if("number".equals(nodeName)){  
  74.                             person.setNumber(nodeValue);  
  75.                         }  
  76.                     }  
  77.                 }//end for j     
  78.                 persons.add(person);  
  79.             }//end for i  
  80.               
  81.             return persons;  
  82.   
  83.               
  84.         } catch (Exception e)  
  85.         {  
  86.             e.printStackTrace();  
  87.         }  
  88.           
  89.           
  90.         return null;  
  91.     }  
  92. }  

接着就是Activity的代码了:

  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.widget.ListView;  
  12. import android.widget.SimpleAdapter;  
  13.   
  14. public class PullActivity extends Activity  
  15. {  
  16.       
  17.     private ListView listView;  
  18.     private SimpleAdapter adapter;  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState)  
  22.     {  
  23.         // TODO Auto-generated method stub  
  24.         super.onCreate(savedInstanceState);  
  25.         setContentView(R.layout.xml_handler);  
  26.           
  27.         listView = (ListView)findViewById(R.id.xml_list);  
  28.         try  
  29.         {  
  30.             //自完义适配方法  
  31.             getAdapter();  
  32.               
  33.         } catch (Exception e)  
  34.         {  
  35.             e.printStackTrace();  
  36.         }  
  37.         listView.setAdapter(adapter);  
  38.     }  
  39.   
  40.     //自定义适配方法  
  41.     private void getAdapter() throws Exception  
  42.     {  
  43.         List<Map<String, String>> lists = new ArrayList<Map<String, String>>();  
  44.           
  45.         //这一部分就是刚才我们做测试用的部分  
  46.         File SD_Files = Environment.getExternalStorageDirectory();  
  47.         String file_path = SD_Files.getName() + File.separator + "persons.xml";  
  48.         //PULL解析文档  
  49. //      FileInputStream input = new FileInputStream(new File(file_path));  
  50. //      PullHandler pullHandler = new PullHandler(input);  
  51. //      List<Person> persons = pullHandler.getPersons();  
  52.         //SAX解析文档  
  53. //      FileInputStream fis = new FileInputStream(new File(file_path));  
  54. //      SAXParser parser = SAXParserFactory.newInstance().newSAXParser();  
  55. //      SaxHandler saxHandler = new SaxHandler();  
  56. //      parser.parse(fis, saxHandler);  
  57. //      List<Person> persons = saxHandler.getPersons();  
  58.         //Dom解析文档  
  59.         FileInputStream fis = new FileInputStream(new File(file_path));  
  60.         DomHandler domHandler = new DomHandler(fis);  
  61.         List<Person> persons = domHandler.getPersons();  
  62.           
  63.         //将persons中的数据转换到ArrayList<Map<String, String>>中,因为SimpleAdapter要用这个类型的数据进行适配  
  64.         Map<String, String> map;  
  65.         for(Person p : persons){  
  66.             map = new HashMap<String, String>();  
  67.               
  68.             map.put("id", p.getId());  
  69.             map.put("status", p.getStatus());  
  70.             map.put("name", p.getName());  
  71.             map.put("tool", p.getTool());  
  72.             map.put("number", p.getNumber());  
  73.               
  74.             lists.add(map);  
  75.         }  
  76.           
  77.         //HashMap<String, String>中的key  
  78.         String[] from = {"id""status""name""tool""number"};  
  79.         //list_item.xml中对应的控件ID  
  80.         int[] to = {R.id.item_id, R.id.item_status, R.id.item_name, R.id.item_tool, R.id.item_number};  
  81.           
  82.         adapter = new SimpleAdapter(this, lists, R.layout.handler_list_item, from, to);  
  83.           
  84.     }  
  85. }  


其实Dom有Android中还是用的比较少的,主要是考虑性能的问题,毕竟手机不比服务器或电脑啊。

下一章,我们将会介绍Json的解析方法,希望各位同学们认真学习。

呵呵,十月长假很快就结束了,又要努力工作和学习了。谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值