Android SAX解析与生成XML

来源:互联网 发布:淘宝什么叫发票抬头 编辑:程序博客网 时间:2024/04/29 12:25

用sax 来解析xml


main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <Button        android:id="@+id/btnSaxXml"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="SAX解析XML" />    <Button        android:id="@+id/btnOutXml"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="生成XML" />    <EditText        android:id="@+id/editText"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="@+id/editText" /></LinearLayout>

text.xml

<?xml version="1.0" encoding="utf-8"?><test>    <title>Sax XML test</title>    <content aa="1" bb="2">        <name>hotye</name>        <url>http://www.baidu.com</url>    </content></test>

SaxHander.java

import java.util.ArrayList;import java.util.List;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import android.util.Log;public class SaxHander extends DefaultHandler {private List<String> keys = new ArrayList<String>();private List<Object> values = new ArrayList<Object>();@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {String value = new String(ch, start, length);value = value.trim();keys.add("text");values.add(value);Log.e("text", value);}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// 保存开始标记keys.add("startTags");values.add(localName);Log.e("startTags", localName);// 保存属性值for (int i = 0; i < attributes.getLength(); i++) {keys.add("Attr");String[] str = new String[2];str[0] = attributes.getLocalName(i);str[1] = attributes.getValue(i);values.add(str);Log.e("Attr", str[0] + "=" + str[1]);}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// 保存结束标记keys.add("endTags");values.add(localName);Log.e("endTags", localName);}@Overridepublic void startDocument() throws SAXException {super.startDocument();}@Overridepublic void endDocument() throws SAXException {super.endDocument();}public List<String> getKeys() {return keys;}public List<Object> getValues() {return values;}}

Android_XMLActivity.java

import java.io.IOException;import java.io.StringWriter;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.InputSource;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;import org.xmlpull.v1.XmlSerializer;import android.app.Activity;import android.content.res.Resources.NotFoundException;import android.os.Bundle;import android.util.Xml;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class Android_XMLActivity extends Activity {Button btnSaxXml, btnOutXml;EditText editText;SaxHander saxHander = new SaxHander();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btnSaxXml = (Button) findViewById(R.id.btnSaxXml);btnOutXml = (Button) findViewById(R.id.btnOutXml);btnSaxXml.setOnClickListener(new ClickEvent());btnOutXml.setOnClickListener(new ClickEvent());editText = (EditText) findViewById(R.id.editText);}class ClickEvent implements OnClickListener {@Overridepublic void onClick(View v) {if (v == btnSaxXml) {try {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser saxParser = factory.newSAXParser();XMLReader xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(saxHander);xmlReader.parse(new InputSource(Android_XMLActivity.this.getResources().openRawResource(R.raw.test)));StringBuffer buffer = new StringBuffer();for (int i = 0; i < saxHander.getKeys().size(); i++) {if ("text".equals(saxHander.getKeys().get(i).toString()) && saxHander.getValues().get(i).toString().length()>1) {buffer.append(saxHander.getValues().get(i-1).toString() + "=" + saxHander.getValues().get(i).toString());buffer.append("\n");}}editText.setText(buffer);} catch (NotFoundException e) {e.printStackTrace();} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else if (v == btnOutXml) {try {XmlSerializer xmlSerializer = Xml.newSerializer();StringWriter stringWriter = new StringWriter();xmlSerializer.setOutput(stringWriter);xmlSerializer.startDocument("utf-8", true);for (int i = 0; i < saxHander.getKeys().size(); i++) {if (saxHander.getKeys().get(i).equals("startTags")) {xmlSerializer.startTag("", saxHander.getValues().get(i).toString());} else if (saxHander.getKeys().get(i).equals("Attr")) {String[] str = (String[]) saxHander.getValues().get(i);xmlSerializer.attribute("", str[0], str[1]);} else if (saxHander.getKeys().get(i).equals("text")) {xmlSerializer.text(saxHander.getValues().get(i).toString());} else if (saxHander.getKeys().get(i).equals("endTags")) {xmlSerializer.endTag("", saxHander.getValues().get(i).toString());}}xmlSerializer.endDocument();String text = stringWriter.toString();text = text.replace("><", ">\r\n<");editText.setText(text);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}}