用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>();
@Override
public 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);
}
@Override
public 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]);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// 保存结束标记
keys.add("endTags");
values.add(localName);
Log.e("endTags", localName);
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
@Override
public 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();
@Override
public 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 {
@Override
public 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();
}
}
}
}
}