• 文件androidAndroid使用PULL解析和生成XML文件


    在写这篇文章之前,xxx已经写过了几篇关于改文件android主题的文章,想要了解的朋友可以去翻一下之前的文章

         

          请大家伙多多指教

          邮箱:weimingweicom@sina.com

          使用PULL剖析和生成XML文件:

     在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)Android附带的pull剖析器剖析XML文件。 下面是本例子要剖析的XML文件:

        文件名称:csdn.xml

     这个文件要放在图片的目录下:

      文件和android

        <?xml version="1.0" encoding="UTF-8"?>

        <persons>

        <person id="23">

        <name>李明</name>

        <age>30</age>

        </person>

        <person id="20">

        <name>李向梅</name>

        <age>25</age>

        </person>

        </persons>

        例子定义了一个javabean用于寄存下面剖析出来的xml内容, 这个javabeanPerson,代码请见本页下面备注:

        public class Person {

        private Integer id;

        private String name;

        private Short age;

        public Integer getId() {

        return id;

        }

        public void setId(Integer id) {

        this.id = id;

        }

        public String getName() {

        return name;

        }

        public void setName(String name) {

        this.name = name;

        }

        public Short getAge() {

        return age;

        }

        public void setAge(Short age) {

        this.age = age;

        }

        }

        布局的效果:

        文件和android

        布局代码:

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:paddingBottom="@dimen/activity_vertical_margin"

        android:paddingLeft="@dimen/activity_horizontal_margin"

        android:paddingRight="@dimen/activity_horizontal_margin"

        android:paddingTop="@dimen/activity_vertical_margin"

        tools:context=".MainActivity" >

        <Button 

            android:id="@+id/btn_pull"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="@string/text_pull"/>

     <Button

            android:id="@+id/btn_cpull"

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:layout_alignLeft="@+id/btn_pull"

            android:layout_alignParentRight="true"

            android:layout_below="@+id/btn_pull"

            android:layout_marginTop="28dp"

            android:text="@string/btn_cxml" />

        </RelativeLayout>

        String.xml里面的值代码:

        <?xml version="1.0" encoding="utf-8"?>

        <resources>

        <string name="app_name">AndoridPull剖析和生成Xml文件</string>

        <string name="action_settings">Settings</string>   

        <string name="text_pull">采取pull剖析xml文件</string>

        <string name="btn_cxml">采取pull剖析器生成xml文件</string>

        </resources>

        使用Pull剖析器读取XML文件

        除了可以使用 SAXDOM剖析XML文件,大家也可以使用Android内置的Pull剖析器剖析XML文件。 Pull剖析器的运行方式与 SAX 剖析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发响应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件停止处理。当元素开始剖析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

        使用Pull剖析器读取itcast.xml的代码在本页下方备注

        Pull剖析器的源码及文档下载网址:http://www.xmlpull.org/

        有些时候,我们须要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull剖析器生成XML文件,这里推荐大家使用Pull剖析器。

        使用Pull剖析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在本页下方备注

        使用代码如下(生成XML文件):

        File xmlFile = new File("myitcast.xml");

        FileOutputStream outStream = new FileOutputStream(xmlFile);

        OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");

        BufferedWriter writer = new BufferedWriter(outStreamWriter);

        writeXML(persons, writer);

        writer.flush();

        writer.close();

        如果只想得到生成的xml字符串内容,可以使用StringWriter

        StringWriter writer = new StringWriter();

        writeXML(persons, writer);

        String content = writer.toString();

        每日一道理
    如果说生命是一座庄严的城堡,如果说生命是一株苍茂的大树,如果说生命是一只飞翔的海鸟。那么,信念就是那穹顶的梁柱,就是那深扎的树根,就是那扇动的翅膀。没有信念,生命的动力便荡然无存;没有信念,生命的美丽便杳然西去。(划线处可以换其他词语)

        使用Pull剖析xml文件时的服务层的代码:

      

        package com.example.andorid04pullxml.service;

        import java.io.File;

        import java.io.FileNotFoundException;

        import java.io.FileOutputStream;

        import java.io.InputStream;

        import java.util.ArrayList;

        import java.util.List;

        import org.xmlpull.v1.XmlPullParser;

        import org.xmlpull.v1.XmlPullParserException;

        import org.xmlpull.v1.XmlSerializer;

        import android.os.Environment;

        import android.util.Log;

        import android.util.Xml;

        import com.example.andorid04pullxml.domain.Person;

        public class PullXmlService {

        public Person currentPerson;

        // 声明返回值

        public List<Person> readXML(InputStream is) {

        List<Person> persons = null;

        // 首先利用XML.newPullParser()获取剖析对象

        XmlPullParser xmlPullParser = Xml.newPullParser();

        try {// 剖析文件

        xmlPullParser.setInput(is, "UTF-8");

        // 获取剖析的事件类型

        int eventType = xmlPullParser.getEventType();

        // 判断文件剖析的是不是完毕

        while (eventType != XmlPullParser.END_DOCUMENT) {

        switch (eventType) {

        case XmlPullParser.START_DOCUMENT:

        persons = new ArrayList<Person>();

        break;

        case XmlPullParser.START_TAG:

        String tagName = xmlPullParser.getName();

        Log.v("PullXmlService", tagName + "------");

        // 当剖析的标签是person时

        if ("person".equals(tagName)) {

        // 创建person对象

        currentPerson = new Person();

        // 设置id属性      须要停止转化

        currentPerson.setId(Integer.parseInt(xmlPullParser

        .getAttributeValue(null"id")));

        } else if ("name".equals(tagName)) {

        currentPerson.setName(xmlPullParser.nextText());

        } else if ("age".equals(tagName)) {

        currentPerson

        .setAge(new Short(xmlPullParser.nextText()));

        }

        break;

        case XmlPullParser.END_TAG:

        if ("person".equals(xmlPullParser.getName())

        && currentPerson != null) {

        // 把person对象添加到集合中

        persons.add(currentPerson);

        currentPerson = null;

        }

        break;

        }

        // 下一个标签标识

        eventType = xmlPullParser.next();

        }

        // 关闭流

        is.close();

        } catch (Exception e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        // 返回

        return persons;

        }

        /**

         * 采取pull生成XML文件

         * @param persons

         * @return

         */

        public boolean write(List<Person> persons){

        // 采取pull剖析停止实现

        if(Environment.getExternalStorageState().equals(

        Environment.MEDIA_MOUNTED)){

        File sdCardDir = Environment.getExternalStorageDirectory();

        File file = new File(sdCardDir,"mycsdn.xml");

        XmlSerializer serializer = Xml.newSerializer();

        FileOutputStream fos = null;

        try {

        // 根据文件对象创建一个文件的输出流对象

        fos = new FileOutputStream(file);

        // 设置输出的流及编码

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

        // 设置文件的开始

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

        // persons标签开始

        serializer.startTag(null,"persons");

        for(Person person:persons){

        serializer.startTag(null,"person");

        serializer.attribute("null","id",  person.getId() + "");

        // 设置person标签的子标签 name

        serializer.startTag(null"name");

        serializer.text(person.getName());

        serializer.endTag(null"name");

        // 设置person标签的子标签的age

        serializer.startTag(null"age");

        serializer.text(person.getAge() + "");

        serializer.endTag(null"age");

        // person标签的结束

        serializer.endTag(null"person");

        }

        serializer.endTag(null"persons");

        serializer.endDocument();

        fos.flush();

        fos.close();

        return true;

        } catch (Exception e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        }

        return false;

        }

        }

        最主要的MainActivity中的代码:

        package com.example.andorid04pullxml;

        import java.io.IOException;

        import java.util.List;

        import com.example.andorid04pullxml.domain.Person;

        import com.example.andorid04pullxml.service.PullXmlService;

        import android.os.Bundle;

        import android.app.Activity;

        import android.view.Menu;

        import android.view.View;

        import android.widget.Button;

        import android.widget.Toast;

        public class MainActivity extends Activity {

        //pull剖析器业务对象

        public PullXmlService pullXmlService;

        public Button btn_pull,btn_cpull;

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

         // 设置表现的视图

            setContentView(R.layout.activity_main);

            pullXmlService = new PullXmlService();

             // 首先获取按钮组件对象

          btn_pull = (Button) findViewById(R.id.btn_pull);

          btn_cpull = (Button) findViewById(R.id.btn_cpull);

         // 注册事件

         btn_pull.setOnClickListener(new MyOnClickListener());

        

         btn_cpull.setOnClickListener(new MyOnClickListener());

        }

        @Override

        public boolean onCreateOptionsMenu(Menu menu) {

            // Inflate the menu; this adds items to the action bar if it is present.

            getMenuInflater().inflate(R.menu.main, menu);

            return true;

        }

        

        class MyOnClickListener implements View.OnClickListener{

        @Override

        public void onClick(View v) {

            

        int id = v.getId();

        switch (id) {

        case R.id.btn_pull:

        List<Person> persons =  null;

        try {

        persons =     pullXmlService.readXML(getAssets().open("csdn.xml"));

        } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        if(persons != null){

        Toast.makeText(MainActivity.this, "采取pull剖析xml文件"+persons.get(0).getName()+"--"+persons.get(1).getName(),

        Toast.LENGTH_LONG).show();

        }

        break;

        case R.id.btn_cpull:

        try {

        List<Person>persons1 =     pullXmlService.readXML(getAssets().open("csdn.xml"));

        //从新生成一个xml文件 mycsdn.xml

        boolean flag = pullXmlService.write(persons1);

        if(flag){

        Toast.makeText(MainActivity.this, "采取pull剖析生产xml文件成功",

        Toast.LENGTH_LONG).show();

        }else{

        Toast.makeText(MainActivity.this, "采取pull剖析生产xml文件失败",

        Toast.LENGTH_LONG).show();

        }

        } catch (IOException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

        }

        break;

        default:

        break;

        }

        }

        

        }

        

        }

        剖析后的效果图:

        文件和android

        生成后的效果图:

        文件和android

        生成的目录:

        文件和android

        生成的xml文件:

        文件和android

    文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

    --------------------------------- 原创文章 By
    文件和android
    ---------------------------------

  • 相关阅读:
    在jQuery ajax中按钮button和submit的区别分析
    jQuery学习-打字游戏
    AndroidManifest.xml权限大全
    判断数据连接----小程序
    ADB常用的几个命令
    Android的ADB配置环境和adb指令使用
    读懂Android项目结构目录
    Android四大组件
    多态继承
    匿名内部类
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3111414.html
Copyright © 2020-2023  润新知