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
相关文章推荐
- (五十七)android解析XML总结(SAX、Pull、Dom三种方式)
- 安卓使用sax、dom、pull解析xml
- Android解析XML三种方式(PULL、SAX、DOM)
- Java进阶之Sax、Dom和Pull解析xml
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android-DOM、SAX、PULL解析网络xml
- Android-解析XML(Dom,Sax,Pull)
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
- Android用Sax,Pull,Dom解析xml
- Android解析XML三种方式(PULL、SAX、DOM)
- Android之SAX、DOM和Pull解析XML
- 解析XML:DOM,SAX,PULL
- android解析XML总结(SAX、Pull、Dom三种方式)
- Android系列--DOM、SAX、Pull解析XML
- android学习——使用SAX、DOM 和 PULL 解析xml文件,及使用pull生成xml文件
- Android 使用SAX或者DOM或者pull解析XML文件
- Android 中利用SAX ,Dom,pull解析 XML 文件
- Java解析xml的主要解析器: SAX和DOM的选择(附上新方法--Pull解析)
- Xml解析dom,sax,pull理解
- android解析XML总结(SAX、Pull、Dom三种方式)