Android 的 view 通常都是 使用 xml 定义的,在代码中使用R.id.btn 这样的形式来使用 xml 资源。Android 的布局文件也是通过 xml 定义的,在代码中使用R.layout.activity的形式来使用xml资源。对于一些系统配置,我们也可以定义成xml文件,那么我们能否使用自定义的xml资源呢?答案是可以的,今天我们就来探讨这个问题。
我们要使用的 xml 资源:books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book price="97" year="2012">AspNetMvc</book>
<book price="98" year="2013">Android</book>
<book price="99" year="2014">Oracle Database</book>
</books>
解析xml的Activity
package com.justin.example;
import java.io.IOException;
import org.xmlpull.v1.XmlPullParserException;
import com.example.androidexample.R;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class ParseXmlActivity extends Activity {
private Button btn;
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_xml);
btn = (Button)findViewById(R.id.btnParse);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//Get xml parser by xml resource id
//XmlPullParse is the base class of XmlResourceParser
XmlResourceParser parser = getResources().getXml(R.xml.books);
//StringBuilder will be used to create string which will be displayed on EditText
StringBuilder sb = new StringBuilder();
try{
//If it is not the end of the document
while(parser.getEventType() != XmlResourceParser.END_DOCUMENT){
if(parser.getEventType() == XmlResourceParser.START_TAG){
String name = parser.getName();
if(name.equals("book")){
String bookPrice = parser.getAttributeValue(null,"price");
sb.append("价格");
sb.append(bookPrice);
String bookYear = parser.getAttributeValue(null,"year");
sb.append("年代");
sb.append(bookYear);
String bookName = parser.nextText();
sb.append("书名");
sb.append(bookName);
}
sb.append("\n");
}
parser.next();
}
edit = (EditText) findViewById(R.id.xml);
edit.setText(sb.toString());
}
catch(XmlPullParserException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
});
}
}
activity 的 界面布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Android Parse Xml"
android:textSize="20sp"/>
<TableRow>
<Button
android:id="@+id/btnParse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text='Parse Xml'
android:textSize="16sp"/>
</TableRow>
<TableRow>
<EditText
android:id="@+id/xml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:textSize="16sp"/>
</TableRow>
</TableLayout>
</LinearLayout>
注意:
1.不要忘记把Activity注册到AndroidManifest.xml文件中。
2.xml文件需要定义早res\xml目录下,默认项目目录结构中没有xml目录,需要手动创建。
运行效果如下:
总结:
JAVA 有 DOM,SAX等解析XML的方式,但是Android有自己的解析XML方式,既然是Adroid设计了自己的解析xml的方式,那么最好使用Android定义的方式。