xml文件可以用户储存我们的数据,或者作为配置文件等。xml文件可以位于res/xml目录下面,例如我们在该目录下放置一个xml文件words.xml,如下:

<?xml version="1.0" encoding="utf-8"?>  
    <ListItems desrciption="Put the entry as the item in Android List">  
        <Entry value="One" />  
        <Entry value="Two" />  
        <Entry value="Three" />  
        <Entry value="Four" />  
        <Entry value="Five" />  
        <Entry value="Six" />  
        <entry>Hello</entry>  
    </ListItems>


 XmlPullParser可以用于解释xml文件。这里有两种xml的常见格式:<entry>Hello</entry>和<Entry value="Six" />,在Android XML中使用后者,而这种方式在XmlPullParser中处理也非常方便。它的使用方式归纳如下:

  1. XmlPullParser通过next(),依次向下检查
  2. XmlPullParser是事件驱动,如果检测到END_DOCUMENT,应当停止继续检测
  3. XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。
  4. XmlPullParser是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容
  5. 对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT,可通过getText()来获取内容。
  6. 由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理

XmlPullParser中标签变量说明:

START_DOCUMENT : 0


END_DOCUMENT : 1


START_TAG :2


END_TAG : 3


TEXT : 4


CDSECT : 5


ENTITY_REF : 6


IGNORABLE_WHITESPACE : 7

下面的例子,我们将上述的words.xml分析处理,将Entry数值作为listActivity的每个item的内容。

/* 1. XmlPullParser通过next(),依次向下检查 
     * 2. XmlPullParser是事件驱动,如果检测到 END_DOCUMENT,应当停止继续检测 
     * 3. XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。 
     * 4. XmlPullParser 是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容 
     * 5. 对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT, 可通过getText()来获取内容。 
     * 6. 由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理 
    */  
    public class Chapter20Test3 extends ListActivity{  
        private ArrayList<String> items = new ArrayList<String>();  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
              
            /*步骤1:进行特定xml文件words的解析,对应第6点,应采用异常捕获防止程序出错*/   
            try{  
                /* 步骤2:获取xml文件,并给给出XmlPullParser对象*/    
                XmlPullParser xpp = getResources().getXml(R.xml.words);  
                /* 步骤3:通过循环,逐步解析XML,直至xml文件结束,对应第1点和第2点*/   
                while(xpp.getEventType()!=XmlPullParser.END_DOCUMENT){  
                    /* 步骤4:获取目标ListItems的解析,并将之用method:ListItems来处理,对应第3点 */  
                    if(xpp.getEventType() == XmlPullParser.START_TAG){  
                        if(xpp.getName().equals("ListItems")){  
                            getItems(xpp);  
                        }  
                    }  
                    xpp.next();  
                }  
            }catch(Throwable t){  
                Toast.makeText(this, "Failed:" + t.toString(), 2000).show();  
            }  
            setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));  
        }  
          
        /* 解析<ListItems ... >.... </Listitem>的内容,获取每个entry的value的值,注意对异常的处理*/  
        private void getItems(XmlPullParser xpp) throws Throwable{  
            while(true){  
                xpp.next();  
                /*<ListItems> ...</ListItems>的内容已经检索完毕,或者文件结束,都退出处理*/  
                if((xpp.getEventType() == XmlPullParser.END_TAG && xpp.getName().equals("ListItems"))   
                  || xpp.getEventType() == XmlPullParser.END_DOCUMENT)  
                    break;  
      
                if(xpp.getEventType()==XmlPullParser.START_TAG) {  
                    /*观测点:对第3点的处理,读出属性的名字和数值*/  
                    if(xpp.getName().equals("Entry")){  
                        for(int i = 0; i < xpp.getAttributeCount() ; i ++){  
                            if(xpp.getAttributeName(i).equals("value")){  
                                items.add(xpp.getAttributeValue(i));  
                            }  
                        }  
                    }  
                    /*观测点:对第5点的处理,处理<name>value</name>*/  
                    if(xpp.getName().equals("entry")){  
                        xpp.next();  
                        if(xpp.getEventType()==XmlPullParser.TEXT)  
                            items.add(xpp.getText());  
                    }  
                }  
            }  
      
        }  
      
        @Override  
        protected void onListItemClick(ListView l, View v, int position, long id) {  
            super.onListItemClick(l, v, position, id);  
            Toast.makeText(this, items.get(position), Toast.LENGTH_LONG).show();  
        }  
          
    }