天天看点

pull解析与生成xml文件

大家晚上好,今天给大家讲解的是pull解析与生成xml文件,这主要有两个效果,其一,将完整格式的xml解析,在listView列表显示,这个知识点就要运用上几讲关于适配器知识点来做,其二,自己定义标准格式的xml文件,生成并发放在内部储存中。

pull解析与生成xml文件

由于这次的代码比较多,我主要讲解关键的代码,其他布局什么的,就不讲,有不懂可以是底下问我。

1.PullActivity.java

private ListView bookList;

 private List<Map<String, Object>> data;

 private Context context;

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_pull);

  bookList = (ListView) findViewById(R.id.list);

  context = this;

  try {

   //用输入流获取asset下的xml文件

   InputStream is = getAssets().open("book.xml");

   //调用业务层方法,方法的结果存在List的data值里

   data = fileManager.parse(is);

   //创建简单型适配器,参数一:上下文,参数二:要存的数据 参数三:layout布局  ,参数四:从哪里来,key值 ,参数五:到哪里去,布局对应的Id

   SimpleAdapter adapter = new SimpleAdapter(this, data,

     R.layout.item_list, new String[] { "name", "price" },

     new int[] { R.id.name_et, R.id.price_et });

   //设置适配器,展示数据

   bookList.setAdapter(adapter);

  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 public void export(View v) {

  try {

   //获取导入的路径,getFilesDir()

   File rootPath = context.getFilesDir();

   //创建文件,参数一:路径 ,参数二:xml命名

   File file = new File(rootPath, "new2.xml");

  //输出流写入数据

   FileOutputStream fos = new FileOutputStream(file);

   Toast.makeText(context, "导入成功", Toast.LENGTH_SHORT).show();

//调用业务层的方法,传的参数是,data,fos,

   fileManager.export(data, fos);

  } catch (Exception e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

2.fileManager.java  业务层,主要书写方法

//定义声明

private static final String BOOK = "book";

 private static final String BOOKS = "books";

 private static final String NAME = "name";

 private static final String ID = "id";

 private static final String PRICE = "price";

 public static List<Map<String, Object>> parse(InputStream is)

   throws Exception {

  List<Map<String, Object>> data = null;

  HashMap<String, Object> map = null;

//创建解析器

  XmlPullParser parser = Xml.newPullParser();

  //设置编码方式

  parser.setInput(is, "utf-8");

  //获取xml类型

  int eventType = parser.getEventType();

 //当条件满足时,开始执行循环

  while (eventType != XmlPullParser.END_DOCUMENT) {

 //switch case 判断

   switch (eventType) {

  //开始文档

   case XmlPullParser.START_DOCUMENT:

    //初始化保存的列表

    data = new ArrayList<Map<String, Object>>();

    break;

   //开始标签

   case XmlPullParser.START_TAG:

    //得到开始标签下的属性值

    String name = parser.getName();

    //逐一开始判断,

  //属性值的BOOK时

    if (name.equals(BOOK)) {

     map = new HashMap<String, Object>();

    //得到id值

     String id = parser.getAttributeValue(0);

     map.put(ID, Integer.valueOf(id));

    //属性值Name时

    } else if (name.equals(NAME)) {

     map.put(NAME, parser.nextText());

//属性值为PRICE时

    } else if (name.equals(PRICE)) {

     map.put(PRICE, parser.nextText());

    }

    break;

   //结束标签

   case XmlPullParser.END_TAG:

    if (parser.getName().equals(BOOK)) {

 //添加到列表中

     data.add(map);

    }

    break;

   default:

    break;

   }

//最关键的地方,每次都要在往下执行一次

   eventType = parser.next();

  }

返回已有数据的data值

  return data;

 }

 public static void export(List<Map<String, Object>> data,

   FileOutputStream fos) throws Exception {

  //创建序号器,它有个特点,有了开始,必定有结束

  XmlSerializer serializer = Xml.newSerializer();

  //输出流的格式

  serializer.setOutput(fos, "utf-8");

 //开始文档

  serializer.startDocument("utf-8", true);

 //开始标签,开始的标签的命名为BOOKS

  serializer.startTag(null, BOOKS);

 //用map集合进行data遍历

  for (Map map : data) {

   //下一个开始标签BOOK

   serializer.startTag(null, BOOK);

   //设置属性ID,用map得到id的实际值

   serializer.attribute(null, ID, map.get(ID).toString());

   //下一个开始标签,NAME

   serializer.startTag(null, NAME);

   //设置文本值

   serializer.text(map.get(NAME).toString());

   serializer.endTag(null, NAME);

 //设置下一个开始标签PRICE

   serializer.startTag(null, PRICE);

   //设置PRICE值

   serializer.text(map.get(PRICE).toString());

//结束标签

   serializer.endTag(null, PRICE);

   serializer.endTag(null, BOOK);

  }

  //结束标签有头也有尾

  serializer.endDocument();

  serializer.endTag(null, BOOKS);

  //关闭输出流

  fos.close();

 }

pull解析与生成就到这里,为什么要详细讲解这个解析呢,因为在我们做开发的时候,解析与生成xml最常用的方法就是pull,大家好好看看这篇博客,相信能给大家以后开发项目有用。时间过得很快,凌晨十二点多了,该洗洗睡,熬夜伤身,养好身体才有精力敲代码。晚安。