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