android之dom解析xml 样式二



android之dom解析xml 样式二_第1张图片

好吧,我们还是来实现这张图的效果,只不过技术我们改为了dom,至于这里的图片上为什么显示的是sax解析,我只能说,哎,没办法,我想偷懒啊。嘿嘿……再看代码结构图:

android之dom解析xml 样式二_第2张图片

main.xml

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView    
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:id="@+id/textView"  
  11.     />  
  12. </LinearLayout>  

beauties.xml

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beauties>  
  3.     <beauty>  
  4.         <name>林志玲</name>  
  5.         <age>28</age>  
  6.     </beauty>  
  7.     <beauty>  
  8.         <name>杨幂</name>  
  9.         <age>23</age>  
  10.     </beauty>  
  11.   
  12. </beauties>  

activity的代码:

[java]  view plain copy
  1. package cn.com.dom;  
  2.   
  3. import java.io.InputStream;  
  4. import java.util.ArrayList;  
  5.   
  6. import javax.xml.parsers.DocumentBuilder;  
  7. import javax.xml.parsers.DocumentBuilderFactory;  
  8.   
  9. import org.w3c.dom.Document;  
  10. import org.w3c.dom.Element;  
  11. import org.w3c.dom.Node;  
  12. import org.w3c.dom.NodeList;  
  13.   
  14. import android.app.Activity;  
  15. import android.os.Bundle;  
  16. import android.util.Log;  
  17. import android.widget.TextView;  
  18.   
  19. /** 
  20.  *  
  21.  * @author chenzheng_java 
  22.  * @description 使用dom解析xml 
  23.  * @since 2011/03/04 
  24.  *  
  25.  */  
  26. public class DomParseXmlTest extends Activity {  
  27.     // 存储最终在前台显示的内容  
  28.     private String result = "";  
  29.   
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.   
  35.         InputStream inputStream = this.getClassLoader().getResourceAsStream(  
  36.                 "beauties.xml");  
  37.         try {  
  38.             DocumentBuilderFactory factory = DocumentBuilderFactory  
  39.                     .newInstance();  
  40.             DocumentBuilder builder = factory.newDocumentBuilder();  
  41.             Document document = builder.parse(inputStream);  
  42.             // 获取根节点  
  43.             Element root = document.getDocumentElement();  
  44.   
  45.             parse(root);  
  46.   
  47.             for (Beauty b : beautyList) {  
  48.                 result += b.toString();  
  49.             }  
  50.   
  51.             TextView textView = (TextView) findViewById(R.id.textView);  
  52.             textView.setText(result);  
  53.   
  54.         } catch (Exception e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.   
  58.     }  
  59.   
  60.     private Beauty beauty = null;  
  61.     private ArrayList<Beauty> beautyList = new ArrayList<Beauty>();  
  62.   
  63.     /** 
  64.      *  
  65.      * @param element 将要进行遍历的节点 
  66.      */  
  67.     private void parse(Element element) {  
  68.         NodeList nodelist = element.getChildNodes();  
  69.         int size = nodelist.getLength();  
  70.         for (int i = 0; i < size; i++) {  
  71.             // 获取特定位置的node  
  72.             Node element2 = (Node) nodelist.item(i);  
  73.             /* getNodeName获取tagName,例如<book>thinking in android</book>这个Element的getNodeName返回book 
  74.              * getNodeType返回当前节点的确切类型,如Element、Attr、Text等 
  75.              * getNodeValue 返回节点内容,如果当前为Text节点,则返回文本内容;否则会返回null 
  76.              * getTextContent 返回当前节点以及其子代节点的文本字符串,这些字符串会拼成一个字符串给用户返回。例如 
  77.              * 对<book><name>thinking in android</name><price>12.23</price></book>调用此方法,则会返回“thinking in android12.23” 
  78.              */  
  79.             String tagName = element2.getNodeName();  
  80.             if (tagName.equals("beauty")  
  81.                     && element2.getNodeType() == Document.ELEMENT_NODE) {  
  82.                 beauty = new Beauty();  
  83.                 Log.i("通知:""创建beauty");  
  84.                 if (element2.getNodeType() == Document.ELEMENT_NODE) {  
  85.                     parse((Element) element2);  
  86.                 }  
  87.                 Log.i("通知:""添加beauty");  
  88.                 beautyList.add(beauty);  
  89.   
  90.             }  
  91.   
  92.             if (tagName.equals("name")) {  
  93.                 String name = element2.getTextContent();  
  94.                 Log.i("通知:""name" + name);  
  95.                 beauty.setName(name);  
  96.   
  97.             }  
  98.             if (tagName.equals("age")) {  
  99.                 String age = element2.getTextContent();  
  100.                 Log.i("通知:""age" + age);  
  101.                 beauty.setAge(age);  
  102.   
  103.             }  
  104.   
  105.         }  
  106.   
  107.     }  
  108.   
  109.     /** 
  110.      *  
  111.      * @author chenzheng_java 这里使用内部类是为了效率考虑,内部类要比单独顶一个bean类更加的高效以及节约空间 
  112.      *  
  113.      */  
  114.     private class Beauty {  
  115.         String name;  
  116.         String age;  
  117.   
  118.         public String getName() {  
  119.             return name;  
  120.         }  
  121.   
  122.         public void setName(String name) {  
  123.             this.name = name;  
  124.         }  
  125.   
  126.         public String getAge() {  
  127.             return age;  
  128.         }  
  129.   
  130.         public void setAge(String age) {  
  131.             this.age = age;  
  132.         }  
  133.   
  134.         @Override  
  135.         public String toString() {  
  136.             return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";  
  137.         }  
  138.   
  139.     }  
  140. }  

其他都为默认。执行,然后就可以看到正确的结果了

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

写博客的时候,不总结几句废话的孩子不是好孩子。所以,我决定还是说几句:

DOM解析虽然我们在android中并不推荐使用,但是这并不代表着不可以实现。dom的原理是把xml文件的各种部分都看成是节点,所有的节点因为层级关系最后形成了一颗节点树。而DOM的解析方式便是在内存中生存这棵树,并允许用户进行相关的操作。

      这里列出几个dom中经常用到的方法

Node 接口的常用方法
一个节点可以调用
short getNodeType()
方法返回一个表示节点类型的常量(Node接口规定的常量值),例如,对于Element节点,getNodeType()方法返回的值为:
Node.ELEMENT_NODE
节点可以调用
NodeList  getChildNodes()
返回一个由当前节点的所有子节点组成的NodeList对象。节点调用
Node  getFirstChild()
返回当前节点的第一个子节点。节点调用
Node  getLastChild()
返回当前节点的最后一个子节点。节点可以调用
NodeList  getTextContent()
返回当前节点及所有子孙节点中的文本内容。

还有其他的很多很多方法,我们可以通过api来详细了解。因为这里主要是为了学习android,所以关于dom稍微了解下就可以了。

你可能感兴趣的:(android之dom解析xml 样式二)