使用原始XML资源——使用原始XML文件
下面为示例程序添加一个原始的XML文件,将该XML文件放到/res/xml目录下,该XML文件的内容很简单。XML资源的内容如下。
程序清单: \res\xml\books.xml文件
<?xml version="1.0" encoding="UTF-8"?> <books> <book price="99.0" 出版日期="2008年">疯狂Java讲义</book> <book price="89.0" 出版日期="2009年">轻量级Java EE企业应用实践</book> <book price="69.0" 出版日期="2009年">疯狂Ajax讲义</book> </books>
接下来就可以在Java程序中获取该XML资源,并解析该XML资源中的信息。
界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/bn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="解析XML资源"/> <EditText android:id="@+id/show" android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="false" android:cursorVisible="false"/> </LinearLayout>
后台Java文件如下:
package com.example.studyresources; import java.io.IOException; import org.xmlpull.v1.XmlPullParserException; import android.os.Bundle; import android.app.Activity; import android.content.res.XmlResourceParser; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class XmlResTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xml_res_test); //获取bn按钮,并为该按钮绑定事件监听器 Button bn=(Button)findViewById(R.id.bn); bn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub //根据XML资源的ID获取解析该资源的解析器 //XmlResourceParser 是 XmlPullParse的子类 XmlResourceParser xrp=getResources().getXml(R.xml.books); try { StringBuilder sb=new StringBuilder(""); //还没有到XML文档的结尾处 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.show); show.setText(sb.toString()); } catch(XmlPullParserException e) { e.printStackTrace(); } catch(IOException e) { 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.xml_res_test, menu); return true; } }
上面程序中①号粗体字代码用于不断获取Pull解析的解析事件,程序中第一行粗体字只要解析事件不等于XmlResourceParser.END_DOCUMNET(也就是还没有解析结束),程序将一直解析下去,通过这种方式即可把整份XML文档的内容解析出来。
上面的程序中包含了一个按钮和一个文本框,当用户单击该按钮时,程序将会解析指定XML文档,并把文档中的内容显示出来。运行该程序,然后单击“解析XML资源”按钮,程序显示如图6.9所示的界面。