Android开发---如何操作资源目录中的资源文件4 ---访问xml的配置资源文件的内容
Android开发---如何操作资源目录中的资源文件4
XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构。
XmlPullParser可以用于解释xml文件
效果图:
描述:
点击按钮,显示图二信息
1、activity_main.xml
描述:定义了一个按钮
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="XML资源管理" android:onClick="test_4" /> </LinearLayout>
2、MainActivity.java
描述:进行了页面跳转
package com.example.android_shaperesoucesdemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void test_4(View view){ Intent intent = new Intent(this,XMLActivity.class); startActivity(intent); } }
3、activity_xml.xml
描述:
顶一个TextView全屏显示内容
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_xml" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/showText" android:textSize="25sp" /> </LinearLayout>
4、XMLActivity.java
描述:
1、先将定义好的books.xml资源文件加载进来
2、判断该xml文件是否存在,如果存在,则构建一个具有缓存作用的StringBuffer对象来存储读取到的数据
3、然后就进行while循环,只要没有检测到END_DOCUMENT,就继续循环
4、再读取<AAAA bbbb=xxxx c=yyyyy>的内容,判断其中的AAAA是否为null,并且判断有没有检测到START_TAG,如果不是null,且没有检测到START_TAG,那么就将节点名追加缓存中
5、再获取属性,通过getAttributeCount()获取属性的个数,再通过循环获取属性名称和值,然后也追加到缓存中
6、再然后则获取其内容,对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT, 可通过getText()来获取内容。内容获取到后也追加到缓存中
package com.example.android_shaperesoucesdemo; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; public class XMLActivity extends Activity { private TextView showText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xml); showText = (TextView)findViewById(R.id.showText); readXML(); } private void readXML(){ //加载 XML资源文件 XmlPullParser xpp = getResources().getXml(R.xml.books); if (xpp!=null){ //构建一个StringBuffer对象存储读取到的数据 StringBuffer sb = new StringBuffer();
//由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理 try {
//XmlPullParser通过next(),依次向下检查
//XmlPullParser是事件驱动,如果检测到END_DOCUMENT,应当停止继续检测
//通过循环,逐步解析XML,直至xml文件结束
while (xpp.getEventType()!=XmlPullParser.END_DOCUMENT){
//XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,
//属性的个数,可通过getAttributeCount()获取,
//属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。 if (xpp.getName()!=null&&xpp.getEventType()!=XmlPullParser.END_TAG){ sb.append("节点名:"+xpp.getName()+"\n\r");
} //获取节点有没有属性
//通过getAttributeCount()来获取属性的个数 int count = xpp.getAttributeCount(); for (int i=0;i<count;i++){
//通过循环获取属性名称 String attrName = xpp.getAttributeName(i);
//通过循环获取属性的值 String attrValue = xpp.getAttributeValue(i); sb.append(attrName+"="+attrValue+"\n\r"); }
//获取内容 if (xpp.getEventType()==XmlPullParser.TEXT){ sb.append(xpp.getText()+"\n\r"); }
//通过next(),依次向下检查 xpp.next(); }
//将缓存中的数据转化成字符串在showText UI中显示出来 showText.setText(sb.toString()); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }
5、res资源目录下创建xml包,在xml包中创建books.xml文件
books.xml
<?xml version="1.0" encoding="utf-8"?> <books> <book bid = "B0001" price = "50"> <author>涂涂</author> <name>从入门到放弃</name> </book> <book bid = "B0002" price = "50">西游记</book> <book bid = "B0003" price = "55">Android高级应用</book> </books>
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中处理也非常方便。它的使用方式归纳如下:
- XmlPullParser通过next(),依次向下检查
- XmlPullParser是事件驱动,如果检测到END_DOCUMENT,应当停止继续检测
- XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。
- XmlPullParser是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容
- 对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT,可通过getText()来获取内容。
- 由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理
下面的例子,我们将上述的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(); } }