xml数据格式通常有3种解析方式:dom,sax,pull,现在一般用pull方式,pull是安卓内置的解析器.
使用pull解析用xml的话,xml文件是一层层节点往里剖析的,例如下面的xml,从进入xinxi节点开始,一直往里剖析节点,并根据用户自己的条件判断得到相应的数据
(这里的lianxiren在下面的代码中是被dianhuaben替换了)
流程:
1.调用java输入流读取xml文件
2.用ArrayList存放解析后的所有数据
3.定义一个相应的数据类,用来存放解析后的相应数据
4.定义节点名
5.通过XmlPullParserFactory获得XmlpullParser格式的数据
6.调用setInput方法为读到的数据设置编码格式
7.调用getEventType方法获得操作事件,并对数据进行解析
代码:
在UI下创建两个EditText做显示得到的数据,再创建一个Button按钮来触发读取数据
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pull_xml);
//得到UI界面的两个EditText控件
nameEditText = (EditText) findViewById(R.id.pullNameET);
phoneEditText = (EditText) findViewById(R.id.pullPhoneET);
}
//按键事件
public void pullXmlOnClick(View v) throws IOException, XmlPullParserException {
//调用java输入流读取xml文件,这里是读取存储在SD卡里的Xml文件,具体的操作可以参考上一篇博客
FileInputStream in = new FileInputStream(android.os.Environment.getExternalStorageDirectory()+"/dianhuaben.xml");
//用ArrayList存放解析后的所有数据,这里PullXml是自己定义的一个类,用于剖析Xml文件数据
PullXml pullXml = new PullXml();
//调用PullXml的方法getpull(in),返回一个ArrayList对象
ArrayList<Lianxiren> list = pullXml.getpull(in);
//从得到的list中得到保存的数据,并显示出来
nameEditText.setText(list.get(0).getName());
phoneEditText.setText(list.get(0).getPhone());
}
Lianxiren类:
//自定义的Lianxiren类
public class Lianxiren {
String name;
String phone;
//里面两个参数,并且有获取和设置这两个参数的方法
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
具体的剖析过程:
代码:
public class PullXml {
//定义的剖析方法,参数为得到的文件流,这里的Lianxiren是自定义的一个数据类
public ArrayList<Lianxiren> getpull(InputStream in) throws XmlPullParserException, IOException {
//创建一个类型为Lianxiren的ArrayList用于存放解析后的所有数据
ArrayList<Lianxiren> list = new ArrayList<Lianxiren>();
//定义Lianxiren对象来加载数据以及jiedian对象用于判断节点的所属
Lianxiren ren = null;
String jiedian = null;
//通过XmlPullParserFactory获得XmlpullParser格式的数据
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
//调用setInput方法为读到的数据设置编码格式
xpp.setInput(in,"utf-8");
//调用getEventType方法获得操作事件,并对数据进行解析
int type = xpp.getEventType();
//只要不是在文档最后就一直解析
while (type!=XmlPullParser.END_DOCUMENT){
if(type==XmlPullParser.START_TAG){ //如果解析到节点开头
jiedian = xpp.getName(); //就获得节点名
if(jiedian.equals("dianhuaben")){ //如果节点是dianhuaben
ren = new Lianxiren(); //创建相应的类
}
}
else if(type==XmlPullParser.TEXT){ //如果解析到数据内容
if(jiedian.equals("name")){ //如果是节点是name
ren.setName(xpp.getText()); //就把name节点数据存放到类里
}
else if(jiedian.equals("phone")){ //如果是节点phone
ren.setPhone(xpp.getText()); //就把phone节点数据存放到类里
}
}
else if(type==XmlPullParser.END_TAG){ //如果解析到节点结尾 这个结尾是相应标签的结尾
//假如这里是解析<dianhuaben>的节点,那么这里的结尾就是</dianhuaben>
jiedian=xpp.getName(); //就获得节点名
if(jiedian.equals("dianhuaben")){ //如果是节点是dianhuaben,也就是首尾节点一样。
list.add(ren); //就把解析到类里的数据存放到ArrayList里
ren = null; //并清空相应类里的数据
}
}
type = xpp.next(); //如果dianhuaben不是唯一的节点,那么就继续开始下一轮节点解析
}
return list; //最后返回得到的数据
}
}