使用原始的XML资源

来源:互联网 发布:js修改a标签的href 编辑:程序博客网 时间:2024/05/16 12:34
6.5使用原始的XML资源

在某些时候,android应用有些初始化的配置信息,应用相关的数据资源需要保存,一般推荐使用xml文件来保存它们,这种资源就被成为原始XML资源。
6.5.1 定义原始xml资源
原始的XML资源一般报存在res/xml路径下,当使用adt创建android应用时,res目录下并没有包含xml目录,开发者需要自行手动创建一个xml目录。
接下来android应用对原始xml资源没有任何特殊要求,只要它是一份格式良好的xml文档即可。
一旦定义好了原始XML资源,接下来在xml文件中可通过如下语法来访问它 :
@[package_name:]xml.file_name
java中格式 :
[package.]R.xml.file_name

为了在java程序中获取到实际的xml文档,可以通过Resource的如下两个方法来获取 。
1.XmlResourceParser getXML(int id) :获取XML文档,并使用一个XmlPullParser来解析xml文档,该方法返回一个解析器对象(XmlResourceParser是XMLPullParser的子类)
2.InputStream openRewResource(int id) : 获取文档对应的输入流 。

大部分时候,我们可以直接调用getXm(int id)方法来获取xml文档,并对该文档进行解析。android默认使用内置Pull解析器来解析xml文件。

Pull解析类似于SAX解析,都是采取事件驱动方式来解析。当Pull解析器开始工作之后,开发者可不断地调用Pull解析器的next()方法来获取下一个解析事件(开始文档,结束文档,开始标签,结束标签等等)当处于某个元素处时,可调用XmlPullParser的getAttributeValue()方法来获取该元素属性值,也可调用XMLPullParser的nextText()方法来获取文本节点的值。

6.5.2使用原始XML文件

books.xml
<?xml version="1.0" encoding="utf-8"?><books>    <book price = "88.8" 出版时间="2008年" > wanlihua 1 blog </book>    <book price = "79.8" 出版时间="2009年" > wanlihua 2 blog </book>    <book price = "90.8" 出版时间="2010年" > wanlihua 3 blog </book></books>

java:
package com.example.xmlrestest;import android.support.v7.app.ActionBarActivity;import android.content.res.XmlResourceParser;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import org.xmlpull.v1.XmlPullParserException;import java.io.IOException;public class MainActivity extends ActionBarActivity {        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button btn = (Button) findViewById(R.id.button1);                btn.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                // TODO Auto-generated method stub                readBooksXml();                //readGestureXml();            }           });    }        public void readGestureXml() {        //根据XML资源id获取解析该资源的解析器          XmlResourceParser xrp = getResources().getXml(R.xml.gesture_wakeup);               try {              StringBuilder sb = new StringBuilder();              while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {                  //如果遇到了开始标签                  if(xrp.getEventType() == XmlResourceParser.START_TAG){                      //获取该标签的标签名                      String tagName = xrp.getName();                      //如果遇到的的book标签                                                  if(tagName.equals("gesture")){                          //根据属性名来获取属性值                          String gestrueName = xrp.getAttributeValue(null, "name");                          sb.append("name:");                          sb.append(gestrueName);                          //根据属性索引来获取属性值                          String settingKey = xrp.getAttributeValue(1);                          sb.append(" settingkey: ");                          sb.append(settingKey);                                                    String settingKeyCmd = xrp.getAttributeValue(2);                          sb.append(" settingKeyCmd: ");                          sb.append(settingKeyCmd);                        }                      sb.append("\n");                  }                  xrp.next();              }              EditText show = (EditText) findViewById(R.id.textView1);              show.setText(sb.toString());          } catch (XmlPullParserException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (Exception e) {              // TODO Auto-generated catch block              e.printStackTrace();          }        }            public void readBooksXml() {      //根据XML资源id获取解析该资源的解析器        XmlResourceParser xrp = getResources().getXml(R.xml.books);                try {            StringBuilder sb = new StringBuilder();            while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {                //如果遇到了开始标签                if(xrp.getEventType() == XmlResourceParser.START_TAG){                    //获取该标签的标签名                    String tagName = xrp.getName();                    //如果遇到的的book标签                                                if(tagName.equals("book")){                        //根据属性名来获取属性值                        String bookName = xrp.getAttributeValue(null, "price");                        sb.append("价格: ");                        sb.append(bookName);                        //根据属性索引来获取属性值                        String bookPrice = xrp.getAttributeValue(1);                        sb.append(" 出版日期: ");                        sb.append(bookPrice);                        sb.append(" 书名: ");                        sb.append(xrp.nextText());                      }                    sb.append("\n");                }                xrp.next();            }            EditText show = (EditText) findViewById(R.id.textView1);            show.setText(sb.toString());        } catch (XmlPullParserException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }       }      @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        // Handle action bar item clicks here. The action bar will        // automatically handle clicks on the Home/Up button, so long        // as you specify a parent activity in AndroidManifest.xml.        int id = item.getItemId();        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }}