Android 创建与解析XML(三)—— Sax方式(源码)

package yy.android.sax;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class YSAXActivity extends Activity {
    
    private TextView tvXMLCreate;
    private TextView tvXMLResolve;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        tvXMLCreate = (TextView)findViewById(R.id.tvXMLCreate);
        tvXMLResolve = (TextView)findViewById(R.id.tvXMLResolve);
        
        
        String xml = "";
        
        XMLSax xmlSax = new XMLSax(this);
        xml = xmlSax.saxCreateXML();
        tvXMLCreate.setText(xml);
        
        xml = xmlSax.saxResolveXML();
        tvXMLResolve.setText(xml);
    }

}

//

package yy.android.sax;

public class Person {
    private Integer id;
    private String name;
    private String blog;
    
    public Person() {
        this.id = -1;
        this.name = "";
        this.blog = "";
    }

    public Person(int id, String name, String blog) {
        this.id = id;
        this.name = name;
        this.blog = blog;
    }
    
    public Person(Person person) {
        this.id = person.id;
        this.name = person.name;
        this.blog = person.blog;
    }

    public Person getPerson(){
        return this;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public int getId(){
        return this.id;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setBlog(String blog) {
        this.blog = blog;
    }

    public String getBlog() {
        return this.blog;
    }

    public String toString() {
        return "Person \nid = " + id + "\nname = " + name + "\nblog = " + blog + "\n";
    }
}
/

package yy.android.sax;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;

import android.content.Context;

public class XMLSax {

    private final String fileName = "YSaxXML.xml";
    private Context mContext;
    
    public XMLSax(Context context) {
        this.mContext = context;
    }
    
    
    /** Sax方式创建?XML  */
    public String saxCreateXML(){
        StringWriter xmlWriter = new StringWriter();

        Person []persons = new Person[3];    //创建i一个实例数组http://write.blog.csdn.net/yuzhiboyi
        persons[0] = new Person(1, "YUZHIBOYI", "http://blog.csdn.net/YUZHIBOYI");
        persons[1] = new Person(2, "baidu", "http://www.baidu.com");
        persons[2] = new Person(3, "google", "http://www.google.com");
        
        try {
            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(xmlWriter);//保存创建的xml
            handler.setResult(result);
            
            handler.startDocument();
            AttributesImpl attr = new AttributesImpl();
            
            attr.clear();
            attr.addAttribute("", "", "author", "", "homer");
            attr.addAttribute("", "", "date", "", "2012-04-27");
            handler.startElement("", "", "root", attr);
            
            int personsLen = persons.length;
            for(int i=0; i<personsLen; i++){
                attr.clear();
                handler.startElement("", "", "person", attr);    
                
                attr.clear();
                handler.startElement("", "", "id", attr);
                String id = persons[i].getId() + "";
                handler.characters(id.toCharArray(), 0, id.length());
                handler.endElement("", "", "id");

                attr.clear();
                handler.startElement("", "", "name", attr);
                String name = persons[i].getName();
                handler.characters(name.toCharArray(), 0, name.length());
                handler.endElement("", "", "name");

                attr.clear();
                handler.startElement("", "", "blog", attr);
                String blog = persons[i].getBlog();
                handler.characters(blog.toCharArray(), 0, blog.length());
                handler.endElement("", "", "blog");
                
                handler.endElement("", "", "person");
            }
            
            handler.endElement("", "", "root");
            handler.endDocument();
            
        } catch (TransformerFactoryConfigurationError e) {        // SAXTransformerFactory.newInstance
            e.printStackTrace();
        } catch (TransformerConfigurationException e) {            // factory.newTransformerHandler
            e.printStackTrace();
        } catch (IllegalArgumentException e) {        // transformer.setOutputProperty
            e.printStackTrace();
        } catch (SAXException e) {        // handler.startDocument
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //此时xmlWriter里面就是全部xml的内容
        savedXML(fileName, xmlWriter.toString());
        return xmlWriter.toString();
    }
    
    
    /** Sax方式解析XML  */
    public String saxResolveXML(){
        StringWriter xmlWriter = new StringWriter();
        //返回一个xml文件的输入流
        InputStream is = readXML(fileName);
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
             // person处理Handler
            PersonHandler handler = new PersonHandler();    
            // handler开始解析xml,遇到相应的标记就触发相应的方法
            saxParser.parse(is, handler);                    
            
            //获取解析的xml  
            String xmlHeader = handler.getXMLHeader();
            xmlWriter.append(xmlHeader);
            
            List<Person> personsList = handler.getPersons();
            int personsLen = personsList.size();
            for(int i=0; i<personsLen; i++){
                xmlWriter.append(personsList.get(i).toString()).append("\n");
            }
            
        } catch (FactoryConfigurationError e) {            // SAXParserFactory.newInstance
            e.printStackTrace();
        } catch (ParserConfigurationException e) {        // factory.newSAXParser
            e.printStackTrace();
        } catch (SAXException e) {            // factory.newSAXParser
            e.printStackTrace();
        } catch (IllegalArgumentException e) {        // saxParser.parse
            e.printStackTrace();
        } catch (IOException e) {            // saxParser.parse
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return xmlWriter.toString();
    }
    
     /** Handler处理类 */  
    private final class PersonHandler extends DefaultHandler{
        private List<Person> personsList = null;    // 保存person  
        private Person person = null;
        private StringBuffer xmlHeader;        // 保存xml头部信息
        private String tag = null;        // xml Element  
        
          /** 返回解析的xml头部信息 */
        public String getXMLHeader(){
            return xmlHeader.toString();
        }
        
        /** 返回解析的Person实例数组 */
        public List<Person> getPersons(){
            return personsList;
        }
        
        @Override//xml文件开始时,会回调
        public void startDocument() throws SAXException{
            super.startDocument();
            personsList = new ArrayList<Person>();//为解析Person做准备
            xmlHeader = new StringBuffer();//xml的头部信息
        }
        
        @Override//遇到标签时,就是触发
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{
            super.startElement(uri, localName, qName, attributes);
            if("root".equals(localName)) {
                String attrAuthor = attributes.getValue(0);//获得作者名字
                String attrDate = attributes.getValue(1);//获得日期,1为引索
                xmlHeader.append("root").append("\t\t");
                xmlHeader.append(attrAuthor).append("\t");
                xmlHeader.append(attrDate).append("\n");//这样就得到了头部信息
            } else if("person".equals(localName)) {
                person = new Person();
            }
            tag = localName;//记录当前标签
        }
        
        @Override//遇到标签里的内容时,就会触发
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            if (null != tag) {//如果当前标签不为空
                String value = new String(ch, start, length);//获得当前标签的值
                System.out.println("value = " + value);
                if ("id".equals(tag)) {//对号入座
                    person.setId(new Integer(value));
                } else if ("name".equals(tag)) {
                    person.setName(value);
                } else if ("blog".equals(tag)) {
                    person.setBlog(value);
                }
            }
        }
        
        @Override//结束标签时触发
        public void endElement(String uri, String localName, String qName) throws SAXException {
            if("person".equals(qName)) {//当借宿标签时Person时,把这个Person的信息加入数组里
                personsList.add(person);//如果不是就不要加入
                person = null;
            }
            tag = null;//清空
            super.endElement(uri, localName, qName);
        }
        
        @Override//当整个xml文件结束时触发
        public void endDocument() throws SAXException{
//            personsList = null;
            super.endDocument();
        }
    }
   
    private void savedXML(String fileName, String xml) {
        FileOutputStream fos = null;//输出流
        
        try {//把xml内容保存起来,因为后面要解析它
            fos = mContext.openFileOutput(fileName, mContext.MODE_PRIVATE);
            byte []buffer = xml.getBytes();
            fos.write(buffer);
            fos.close();
        } catch (FileNotFoundException e) {        // mContext.openFileOutput
            e.printStackTrace();
        } catch (IOException e) {        // fos.write
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private InputStream readXML(String fileName) {
        FileInputStream fin = null;//输入流
        
        try {
            fin = mContext.openFileInput(fileName);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        
        return fin;//返回输入流
    }  
}

//

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tvXMLCreate"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        android:layout_marginLeft="5dip"  />

        <TextView
            android:id="@+id/tvXMLResolve"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
        android:layout_marginLeft="5dip"  />
    </LinearLayout>
</ScrollView>

转至:http://blog.csdn.net/sunboy_2050/article/details/7521598


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值