您的位置:首页 > 运维架构

Dom Sax Pull解析xml

2012-08-12 16:36 405 查看
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

http://www.ibm.com/developerworks/cn/xml/x-android/

http://blog.csdn.net/ichliebephone/article/details/5981913
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息