Android-Sax解析与生成xml数据

来源:互联网 发布:mac需要键盘膜吗 编辑:程序博客网 时间:2024/05/06 21:07
Android 使用Sax 解析与生成xml数据
MySaxHandler解析类,该类是DefaultHandler的子类startDocument:第一个分析点 事件方法。在该方法中创建了用于保存转换结果的ArrayList<Person>对象。startElement:第二个分析点事件方法。SAX引擎分析到每一个<Person>元素时,在该方法中都创建一个Person对象。endElement: 第三个分析点事件方法。该方法中的代码最复杂,但仔细看一下,其实很简单。             当SAX引擎分析完每一个XML元素后,会将该元素中的文本保存在Person对象的响应属性中。endDocument:第四个分析点事件方法。在该方法中什么都没有做,也没有覆盖这个方法。characters:第五个分析点事件方法。虽然该方法中的代码有开发人员编写的只有一行,但十分关键。           在该方法中将SAX引擎扫描到的内容保存在String变量中。而在endElement方法中要           使用该变量中的内容为Person对象中的属相赋值。
布局文件:
<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:gravity="center"    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/jiexi"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="jiexi"        android:text="sax解析xml" />    <Button        android:id="@+id/shengcheng"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/jiexi"        android:onClick="shengcheng"        android:text="sax生成xml" /></RelativeLayout>

MainActivity.java
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.yulongji.android3;import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.View;import org.xml.sax.InputSource;import org.xml.sax.XMLReader;import org.xml.sax.helpers.AttributesImpl;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.sax.SAXTransformerFactory;import javax.xml.transform.sax.TransformerHandler;import javax.xml.transform.stream.StreamResult;public class MainActivity extends Activity {    //声明装载Person对象的List    private ArrayList<Person> pList;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (pList == null) {            pList = new ArrayList<>();        }    }    public void jiexi(View view) {        getXml();    }    public void shengcheng(View view) {        shengchengXml();    }    //从服务器中获取xml流    public void getXml() {        new Thread() {            @Override            public void run() {                String path = "http://172.16.20.206:8080/mytest/person.xml";                try {                    URL url = new URL(path);                    HttpURLConnection conn = (HttpURLConnection) url                            .openConnection();                    conn.setRequestMethod("GET");                    conn.setConnectTimeout(5000);                    conn.setReadTimeout(5000);                    if (conn.getResponseCode() == 200) {                        Log.v("tag", "链接成功");                        InputStream is = conn.getInputStream();                        jiexiSaxXml(is);                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();    }    //解析xml    public void jiexiSaxXml(InputStream is) {        try {            //通过获取到的InputStream来得到InputSource实例            InputSource isour = new InputSource(is);            //使用工厂方法初始化SAXParserFactory变量saxf            SAXParserFactory saxf = SAXParserFactory.newInstance();            //通过SAXParserFactory得到SAXParser的实例            SAXParser saxp = saxf.newSAXParser();            //通过SAXParser得到XMLReader的实例            XMLReader xmlr = saxp.getXMLReader();            //初始化自定义的类MySaxHandler的变量mysax,将pList传递给它,以便装载数据            MySaxHandler mysax = new MySaxHandler(pList);            //将对象mysax传递给xmlr            xmlr.setContentHandler(mysax);            //调用xmlr的parse方法解析输入流            xmlr.parse(isour);        } catch (Exception e) {            e.printStackTrace();        }        for (Person person : pList) {            System.out.println(person);        }    }    public void shengchengXml() {        try {            FileWriter fw = new FileWriter(                    Environment.getExternalStorageDirectory() + File.separator                            + "person.xml");            //初始化SAXTransformerFactory            SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory.newInstance();            TransformerHandler handler = factory.newTransformerHandler();            Transformer transformer = handler.getTransformer();     // 设置xml属性            transformer.setOutputProperty(OutputKeys.INDENT, "yes");            transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");            transformer.setOutputProperty(OutputKeys.VERSION, "1.0");            StreamResult result = new StreamResult(fw);      // 保存创建的xml            handler.setResult(result);            handler.startDocument();            AttributesImpl attr = new AttributesImpl();            attr.clear();            // attr.addAttribute("", "", "author", "", "yu_longji");            // attr.addAttribute("", "", "date", "", "2015/8/23");            handler.startElement("", "", "persons", attr);            for (int i = 0; i < pList.size(); i++) {                Person person = pList.get(i);                attr.clear();                String id = String.valueOf(person.getId());                //添加属性id值                attr.addAttribute("", "", "id", "", id);                handler.startElement("", "", "person", attr);                attr.clear();                handler.startElement("", "", "name", attr);                String name = person.getName();                //添加标签值                handler.characters(name.toCharArray(), 0, name.length());                handler.endElement("", "", "name");                attr.clear();                handler.startElement("", "", "age", attr);                String age = String.valueOf(person.getAge());                //添加标签值                handler.characters(age.toCharArray(), 0, age.length());                handler.endElement("", "", "age");                handler.endElement("", "", "person");            }            handler.endElement("", "", "persons");            handler.endDocument();        } catch (Exception e) {            e.printStackTrace();        }    }}</span><span style="font-family:KaiTi_GB2312;font-size:18px;"></span>

MySaxHandler.java
package com.example.yulongji.android3;import android.util.Log;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import java.util.ArrayList;/** * Created by yulongji on 2015/8/23. * <p/> * MySaxHandler解析类,该类是DefaultHandler的子类 * <p/> * startDocument:第一个分析点 事件方法。在该方法中创建了用于保存转换结果的ArrayList<Person>对象。 * startElement:第二个分析点事件方法。SAX引擎分析到每一个<Person>元素时,在该方法中都创建一个Person对象。 * endElement: 第三个分析点事件方法。该方法中的代码最复杂,但仔细看一下,其实很简单。 *             当SAX引擎分析完每一个XML元素后,会将该元素中的文本保存在Person对象的响应属性中。 * endDocument:第四个分析点事件方法。在该方法中什么都没有做,也没有覆盖这个方法。 * characters:第五个分析点事件方法。虽然该方法中的代码有开发人员编写的只有一行,但十分关键。 *            在该方法中将SAX引擎扫描到的内容保存在String变量中。而在endElement方法中要 *            使用该变量中的内容为Person对象中的属相赋值。 */public class MySaxHandler extends DefaultHandler {    //声明一个装载Beauty类型的List    private ArrayList<Person> pList;    //声明一个Beauty类型的变量    private Person person;    //声明一个字符串变量    private String string;    /**     * MySaxHandler的构造方法     *     * @param pList 装载返回结果的List对象     */    public MySaxHandler(ArrayList<Person> pList) {        this.pList = pList;    }    // 当SAX解析器解析到XML文档开始时,会调用的方法    @Override    public void startDocument() throws SAXException {        super.startDocument();        Log.i("--start--", "文档开始");    }    /**     * 当SAX解析器解析到某个元素开始时,会调用的方法     * 其中localName记录的是元素属性名     */    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {        super.startElement(uri, localName, qName, attributes);        string = localName;        if ("person".equals(localName)) {            //新建Person对象            person = new Person();            //添加person的id属性值            person.setId(new Integer(attributes.getValue(0)));        }    }    /**     * 当SAX解析器解析到某个属性值时,会调用的方法     * 其中参数ch记录了这个属性值的内容     */    @Override    public void characters(char[] ch, int start, int length) throws SAXException {        super.characters(ch, start, length);        string = new String(ch, start, length);        Log.v("string",string);    }    /**     * 当SAX解析器解析到某个元素结束时,会调用的方法     * 其中localName记录的是元素属性名     */    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {        super.endElement(uri, localName, qName);        if ("name".equals(localName)) {            person.setName(string);        } else if ("age".equals(localName)) {            person.setAge(Integer.parseInt(string));        } else if ("person".equals(localName)) {            pList.add(person);        }    }    // 当SAX解析器解析到XML文档结束时,会调用的方法    @Override    public void endDocument() throws SAXException {        super.endDocument();    }}



0 0
原创粉丝点击