import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringWriter;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.R.string;
import android.content.Context;
public class XmlDom {
private final String filename = "DomXml.xml";
private Context mContext = null;
public XmlDom(Context context) {
this.mContext = context;
}
public String XmlCreate() {
String xmlWriter = null;
Person[] persons = new Person[3];
persons[0] = new Person(1, "facebook", "www.facebook.com");
persons[1] = new Person(2, "baidu", "www.baidu.com");
persons[2] = new Person(3, "google", "www.google.com");
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element eRoot = doc.createElement("root");
eRoot.setAttribute("author", "homer"); //设置根元素属性
eRoot.setAttribute("data", "2012-8-12");
doc.appendChild(eRoot); //将根元素附加到Document对象
for (int i = 0; i < persons.length; i++) {
Element ePerson = doc.createElement("person");//创建“person”元素
eRoot.appendChild(ePerson);
Element eId = doc.createElement("id");//创建“id”节点
Node nodeId = doc.createTextNode(persons[i].getId() + "");
eId.appendChild(nodeId);
ePerson.appendChild(eId);//向“person”中添加“id”元素
Element eName = doc.createElement("name");
Node nodeName = doc.createTextNode(persons[i].getName());
eName.appendChild(nodeName);
ePerson.appendChild(eName);
Element eBlog = doc.createElement("blog");
Node nodeBlog = doc.createTextNode(persons[i].getBlog());
eBlog.appendChild(nodeBlog);
ePerson.appendChild(eBlog);
}
Properties properties = new Properties();
properties.setProperty(OutputKeys.INDENT, "yes");//缩进
properties.setProperty(OutputKeys.VERSION, "1.0");//xml版本
properties.setProperty(OutputKeys.ENCODING, "utf-8");//文档的编码方式
properties.setProperty(OutputKeys.METHOD, "xml");//输出格式
properties.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");//xml声明
//创建一个转换器对象
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperties(properties);
DOMSource domSource = new DOMSource(doc.getDocumentElement());
OutputStream output = new ByteArrayOutputStream();
StreamResult result = new StreamResult(output);
transformer.transform(domSource, result);
xmlWriter = output.toString();
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}
catch (DOMException e) {
e.printStackTrace();
}
catch (TransformerConfigurationException e) {
e.printStackTrace();
}
catch (TransformerException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
saveXml(filename, xmlWriter.toString());
return xmlWriter.toString();
}
// 解析xml
public String xmlParse() {
StringWriter xmlWriter = new StringWriter();
InputStream is = readXml(filename);
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(is);
document.getDocumentElement().normalize();
NodeList nodeRoot = document.getElementsByTagName("root");
Element elementRoot = (Element)nodeRoot.item(0);
String attributeAuthor = elementRoot.getAttribute("Author");
String attributeDate = elementRoot.getAttribute("Date");
xmlWriter.append("root").append("\t");
xmlWriter.append(attributeAuthor).append("\t");
xmlWriter.append(attributeDate).append("\n");
NodeList nodePersion = elementRoot.getElementsByTagName("person");
Person[] persons = new Person[nodePersion.getLength()];
for (int i = 0; i < persons.length; i++) {
Element personElement = (Element)nodePersion.item(i);
Person person = new Person();
NodeList nlId = personElement.getElementsByTagName("id");
Element idElement = (Element)nlId.item(0);
String id = idElement.getChildNodes().item(0).getNodeValue();
person.setId(Integer.parseInt(id));
NodeList nlName = personElement.getElementsByTagName("name");
Element nameElement = (Element)nlName.item(0);
String name = nameElement.getChildNodes().item(0).getNodeValue();
person.setName(name);
NodeList nlBlog = personElement.getElementsByTagName("blog");
Element blogElement = (Element)nlBlog.item(0);
String blog = blogElement.getChildNodes().item(0).getNodeValue();
person.setBlog(blog);
xmlWriter.append(person.toString()).append("\n");
persons[i] = person;
}
}
catch (ParserConfigurationException e) {
// TODO: handle exception
}catch (IOException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
return xmlWriter.toString();
}
private void saveXml(String filename, String xml) {
FileOutputStream fout =null;
try {
fout = mContext.openFileOutput(filename, mContext.MODE_PRIVATE);
byte []buffer = xml.getBytes();
fout.write(buffer);
fout.close();
}
catch (FileNotFoundException e) {
// TODO: handle exception
}catch (IOException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
}
private InputStream readXml(String filename) {
FileInputStream fin = null;
try {
fin = mContext.openFileInput(filename);
}
catch (FileNotFoundException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
return fin;
}
}
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 SaxXml {
private final String fileName = "SaxXml.xml";
private Context mContext = null;
public SaxXml(Context context) {
this.mContext = context;
}
/** Sax方式,创建 XML */
public String saxCreateXML(){
StringWriter xmlWriter = new StringWriter();
Person []persons = new Person[3]; // 创建节点Person对象
persons[0] = new Person(1, "facebook", "www.facebook.com");
persons[1] = new Person(2, "baidu", "www.baidu.com");
persons[2] = new Person(3, "google", "www.google.com");
try {
SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
TransformerHandler handler = factory.newTransformerHandler();//获取能够将 SAX ContentHandler 事件处理为 Result 的 TransformerHandler 对象
Transformer transformer = handler.getTransformer(); // 用于设置参数和输出属性
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();
}
saveXml(fileName, xmlWriter.toString());
return xmlWriter.toString();
}
/** Sax方式,解析 XML */
public String saxResolveXML(){
StringWriter xmlWriter = new StringWriter();//一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串
InputStream is = readXml(fileName);
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
PersonHandler handler = new PersonHandler(); // person处理Handler
saxParser.parse(is, handler); // handler解析xml
// 获取解析的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
public void startDocument() throws SAXException{
super.startDocument();
personsList = new ArrayList<Person>();
xmlHeader = new StringBuffer();
}
@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);
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)) {
personsList.add(person);
person = null;
}
tag = null;
super.endElement(uri, localName, qName);
}
@Override
public void endDocument() throws SAXException{
// personsList = null;
super.endDocument();
}
}
private void saveXml(String fileName, String xml) {
FileOutputStream fout =null;
try {
fout = mContext.openFileOutput(fileName, mContext.MODE_PRIVATE);
byte []buffer = xml.getBytes();
fout.write(buffer);
fout.close();
}
catch (FileNotFoundException e) {
// TODO: handle exception
}catch (IOException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
}
private InputStream readXml(String fileName) {
FileInputStream fin = null;
try {
fin = mContext.openFileInput(fileName);
}
catch (FileNotFoundException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
return fin;
}
}
Pull解析
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 org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import wsi.decodeXml.Person;
import android.content.Context;
public class PullXml {
private final String fileName = "SaxXml.xml";
private Context mContext = null;
public PullXml(Context context) {
this.mContext = context;
}
/** Pull方式,创建 XML */
public String pullXMLCreate(){
StringWriter xmlWriter = new StringWriter();
Person []persons = new Person[3]; // 创建节点Person对象
persons[0] = new Person(1, "facebook", "www.facebook.com");
persons[1] = new Person(2, "baidu", "www.baidu.com");
persons[2] = new Person(3, "google", "www.google.com");
try {
// // 方式一:使用Android提供的实用工具类android.util.Xml
// XmlSerializer xmlSerializer = Xml.newSerializer();
// 方式二:使用工厂类XmlPullParserFactory的方式
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer xmlSerializer = factory.newSerializer();
xmlSerializer.setOutput(xmlWriter); // 保存创建的xml
xmlSerializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
// xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " "); // 设置属性
// xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n");
xmlSerializer.startDocument("utf-8", null); // <?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
xmlSerializer.startTag("", "root");
xmlSerializer.attribute("", "author", "homer");
xmlSerializer.attribute("", "date", "2012-04-28");
int personsLen = persons.length;
for(int i=0; i<personsLen; i++) {
xmlSerializer.startTag("", "person"); // 创建person节点
xmlSerializer.startTag("", "id");
xmlSerializer.text(persons[i].getId()+"");
xmlSerializer.endTag("", "id");
xmlSerializer.startTag("", "name");
xmlSerializer.text(persons[i].getName());
xmlSerializer.endTag("", "name");
xmlSerializer.startTag("", "blog");
xmlSerializer.text(persons[i].getBlog());
xmlSerializer.endTag("", "blog");
xmlSerializer.endTag("", "person");
}
xmlSerializer.endTag("", "root");
xmlSerializer.endDocument();
} catch (XmlPullParserException e) { // XmlPullParserFactory.newInstance
e.printStackTrace();
} catch (IllegalArgumentException e) { // xmlSerializer.setOutput
e.printStackTrace();
} catch (IllegalStateException e) { // xmlSerializer.setOutput
e.printStackTrace();
} catch (IOException e) { // xmlSerializer.setOutput
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
saveXml(fileName, xmlWriter.toString());
return xmlWriter.toString();
}
/** Pull方式,解析 XML */
public String pullXMLResolve(){
StringWriter xmlWriter = new StringWriter();
InputStream is = readXml(fileName);
try {
// // 方式一:使用Android提供的实用工具类android.util.Xml
// XmlPullParser xpp = Xml.newPullParser();
// 方式二:使用工厂类XmlPullParserFactory的方式
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(is, "utf-8");
List<Person> personsList = null; // 保存xml的person节点
Person person = null;
StringBuffer xmlHeader = null; // 保存xml头部
String ele = null; // Element flag
int eventType = xpp.getEventType();
while(XmlPullParser.END_DOCUMENT != eventType) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
personsList = new ArrayList<Person>(); // 初始化persons
xmlHeader = new StringBuffer(); // 初始化xmlHeader
break;
case XmlPullParser.START_TAG:
if("root".equals(xpp.getName())) {
String attrAuthor = xpp.getAttributeValue(0);
String attrDate = xpp.getAttributeValue(1);
xmlHeader.append("root").append("\t\t");
xmlHeader.append(attrAuthor).append("\t");
xmlHeader.append(attrDate).append("\n");
} else if("person".equals(xpp.getName())) {
person = new Person(); // 创建person实例
} else if("id".equals(xpp.getName())) {
ele = "id";
} else if("name".equals(xpp.getName())) {
ele = "name";
} else if("blog".equals(xpp.getName())) {
ele = "blog";
} else {
ele = null;
}
break;
case XmlPullParser.TEXT:
if(null != ele) {
if("id".equals(ele)) {
person.setId(Integer.parseInt(xpp.getText()));
} else if("name".equals(ele)) {
person.setName(xpp.getText());
} else if("blog".equals(ele)) {
person.setBlog(xpp.getText());
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(xpp.getName())){
personsList.add(person);
person = null;
}
ele = null;
break;
}
eventType = xpp.next(); // 下一个事件类型
}
xmlWriter.append(xmlHeader);
int personsLen = personsList.size();
for(int i=0; i<personsLen; i++) {
xmlWriter.append(personsList.get(i).toString());
}
} catch (XmlPullParserException e) { // XmlPullParserFactory.newInstance
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return xmlWriter.toString();
}
private void saveXml(String fileName, String xml) {
FileOutputStream fout =null;
try {
fout = mContext.openFileOutput(fileName, mContext.MODE_PRIVATE);
byte []buffer = xml.getBytes();
fout.write(buffer);
fout.close();
}
catch (FileNotFoundException e) {
// TODO: handle exception
}catch (IOException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
}
private InputStream readXml(String fileName) {
FileInputStream fin = null;
try {
fin = mContext.openFileInput(fileName);
}
catch (FileNotFoundException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
}
return fin;
}
}
参考:http://blog.csdn.net/sunboy_2050/article/details/7516058
http://www.ibm.com/developerworks/cn/xml/x-androidxml/
http://blog.csdn.net/hosterZhu/article/details/6123274
http://blog.csdn.net/sunboy_2050/article/details/7521598
http://blog.csdn.net/sunboy_2050/article/details/7521601