XML:
——使用原始XML资源—放在/res/xml目录下有时Android应用有一些初始化的配置信息,
应用相关的数据资源需要保存,一般推荐使用xml文件来保存,这种资源就被称为原始的XML资源。
——访问原始XML资源:R.xml.file_name
在java程序中获取实际XML文档,可以通过Resource的如下两个方法获取:
XmlResourceParser.getResource.getXml(int):获取XMl文档,并使用XmlPullParser来解析该XML文档,该方法返回一个解析器对象。
InputStream openRawResource(int):获取xml文档对应的输入流
此外还可以使用下面的方式创建PULL解析器对象:
XmlPullParser parser = Xml.newPullParser();//得到Pull解析器
parser.setInput(instream,"UTF-8");//设置下输入流的编码
int eventType = parser.getEventType();//得到第一个事件类型
PULL解析;
Android默认使用内置的Pull解析器来解析xml文件。虽然SAX和DOM解析也能用,推荐使用pull解析。Pull解析类似于SAX解析,都采用事件驱动方式来进行解析。
原理:不断地调用Pull解析器的next方法获取下一个解析事件的类型,根据事件类型判断是否读取到文件的尾部。当处于某个元素处时,可调用getAttributeValue()方法获取该元素的属性值,也可调用nextText()获取文本节点的值。调用getName()获取标签名。
事件类型有:
PULL解析器调用该getEventType()返回事件类型。
XmlPullParser.END_DOCUMENT 文档解析结束
XmlPullParser.START_DOCUMENT 文档开始解析
XmlPullParser.START_TAG 解析到开始标签
XmlPullParser.END_TAG 解析到结束标签
解析xml文件所有人的信息,放到集合中。
import android.content.res.XmlResourceParser;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.xmlpull.v1.XmlPullParser;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private XmlResourceParser xmlResourceParser;
private List<Book> books;
private Book book;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv);
xmlResourceParser = getResources().getXml(R.xml.books);
}
public void start(View view) {
try {
//获得事件类型
int type = xmlResourceParser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlResourceParser.START_DOCUMENT:
Toast.makeText(this, "开始解析", Toast.LENGTH_SHORT).show();
books = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
if ("book".equals(xmlResourceParser.getName())) {
book = new Book();
//getAttributeValue()是获得<book id="1">中的id属性
String id = xmlResourceParser.getAttributeValue(null, "id");
book.setId(id);
}
if (book != null) {
if ("name".equals(xmlResourceParser.getName())) {
book.setName(xmlResourceParser.nextText());
}
if ("author".equals(xmlResourceParser.getName())) {
book.setAuthor(xmlResourceParser.nextText());
}
if ("year".equals(xmlResourceParser.getName())) {
book.setYear(xmlResourceParser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
if ("book".equals(xmlResourceParser.getName())) {
books.add(book);
book = null;
}
break;
}
type = xmlResourceParser.next();
}
Toast.makeText(this, "解析完毕", Toast.LENGTH_SHORT).show();
textView.setText(books.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<books>
<book id="1">
<name>冰与火之歌</name>
<author>乔治.马丁</author>
<year>2011</year>
</book>
<book>
<name>安徒生童话</name>
<author>安徒生</author>
<year>2014</year>
</book>
<book>
<name>Android疯狂讲义</name>
<author>李刚</author>
<year>2000</year>
</book>
</books>