您的位置:首页 > 移动开发 > Android开发

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

2012-06-05 14:46 465 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: