使用原始的XML资源

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);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值