1.第一步:导入一个xml字符串,进行解析:
package com.cn.day12xml;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import Bean.App;
import utils.MyXMLPullUtils;
public class MainActivity extends AppCompatActivity {
private MyXMLPullUtils myXMLPullUtils;
/**
* 一、創建xml文件:
*/
String xmlString = "<apps>\n" +
"<app>\n" +
"\t <id>1</id>\n" +
"\t\t<name>google map</name>\n" +
"\t\t<version>1.0</version>\n" +
"\t</app>\n" +
"\t\n" +
"\t <app>\n" +
"\t <id>2</id>\n" +
"\t\t<name>google play</name>\n" +
"\t\t<version>2.0</version>\n" +
"\t</app>\n" +
"\t\n" +
"\t<app>\n" +
"\t <id>3</id>\n" +
"\t\t<name>chrome</name>\n" +
"\t\t<version>3.0</version>\n" +
"\t</app>\n" +
"\t\n" +
"</apps>";
2.第二步:创建文件步骤:
private TextView tv1;
private TextView tv2;
OutputStream outputStream;
List<App> list=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
App app=new App();
for(int i=0;i<3;i++){
app.setId(i);
app.setName("app"+i);
app.setVersion(i);
list.add(app);
}
Log.i("zzzz",list.toString());
// parseXMLWithPull(xmlString);
try {
String baseUrl= Environment.getExternalStorageDirectory().toString();
String path=baseUrl+ File.separator+"apps.xml";
File file=new File(path);
outputStream=new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
MyXMLPullUtils myXMLPullUtils=new MyXMLPullUtils(outputStream,list);
try {
myXMLPullUtils.save();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
3.第三步:控件绑定:
private void initView() {
tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);
}
4.第四步:用parse方法解析字符串:
/**
* 二、用parse方法來解析字符串:
* 1.创建一個解析工厂 factory :newInstance()
* 2.获取单个的解析类:factory.newPullParser()
* <p>
* 3.读取raeader字符串:StringReader
* 4.设置解析的数据源:xmlPullParser.setInput()
* 5.获取事件类型 eventType:xmlPullParser.getEventType()
* <p>
* 6.解析过程:
* 1>首先设置解析范围:至xml文件文档结束的位置:XmlPullParser.END_DOCUMENT
* 2>其次,获取其每个标题名称: xmlPullParser.getName()
* 3>根据获取的标题依次进行查询:
* 4>查到最后输出结果
* 5>设置游标向下移动
*
* @param xmlString
*/
private void parseXMLWithPull(String xmlString) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
StringReader stringReader = new StringReader(xmlString);
xmlPullParser.setInput(stringReader);
int eventType = xmlPullParser.getEventType();
//设置获取到的信息属性:
String id = "";
String name = "";
String version = "";
//循环读取:
while (eventType != XmlPullParser.END_DOCUMENT) {
String xmlname = xmlPullParser.getName();
switch (eventType) {
case XmlPullParser.START_TAG://起始标签
if ("id".equals(xmlname)) {
id = xmlPullParser.nextText();
} else if ("name".equals(xmlname)) {
name = xmlPullParser.nextText();
} else if ("version".equals(xmlname)) {
version = xmlPullParser.nextText();
}
break;
case XmlPullParser.END_TAG://结束标签
if ("app".equals(xmlname)) {
Log.i("xmlname", "id: " + id + " name: " + name + " version: " + version);
tv1.setText("id: "+id+ " name: " +name+ " version: "+version);
}
break;
}
//游标滑动
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
5.第五步:用pull方法反解析成xml字符串:
package utils;
import android.util.Log;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import Bean.App;
public class MyXMLPullUtils {
/**
* 一、创建读取流OutPutStream + 对象
* 进行解析:
* */
OutputStream os = null;
List<App> list = null;
public MyXMLPullUtils(OutputStream os, List<App> list) {
this.os = os;
this.list = list;
}
/**
* 二、解析过程:
* 1.创建工厂
* 2.实现factory.newSerializer()方法
* 3.使用输出流将序列化的XML输出到指定位置
*
* 4.开启文档
* 5.开始标签
*
* 6.通过遍历集合进行解析:
* startDocument——endDocument
* startTag——endTag
* 7.释放+关闭流:
*/
public void save() throws Exception{
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlSerializer xmlSerializer = factory.newSerializer();
xmlSerializer.setOutput(this.os,"UTF_8");
xmlSerializer.startDocument("UTF_8",true);
xmlSerializer.startTag(null,"apps");
//遍历器:
Iterator<App> iterator = this.list.iterator();
while (iterator.hasNext()){
App app = iterator.next();
xmlSerializer.startTag(null,"app");
xmlSerializer.startTag(null,"id");
xmlSerializer.text(app.getId() + "");
xmlSerializer.endTag(null,"id");
xmlSerializer.startTag(null,"name");
xmlSerializer.text(app.getName()+"");
xmlSerializer.endTag(null,"name");
xmlSerializer.startTag(null,"version");
xmlSerializer.text(app.getVersion()+"");
xmlSerializer.endTag(null,"version");
xmlSerializer.endTag(null,"app");
}
xmlSerializer.endTag(null,"apps");
xmlSerializer.endDocument();
//释放+关闭流:
xmlSerializer.flush();
os.flush();
os.close();
}
}