DOM PULL SAX 三种方式解析XML
2014-10-08 17:03
169 查看
先介绍三种方式的特点,
DOM方式解析XML
DOM解析的工作方式: 先将整个文档装入内存,解析成Document格式,接下来跟解析html一样将文档拆分成文档树, document,element, node,可以自己搜索 获取内容 存下来, 总体来说感觉比较自由, 因为整个文档都在内存中随机存取。
PULL 和SAX方式
PULL,SAX解析的方式是事件触发同步解析,即解析器读到哪里,就对哪里进行处理。由于采用的是流式解析,这就说明它们不能像DOM那样随机访问XML的其中任意一个节点,只能循序解析。
PULL,SAX都是基于事件机制,通过判断事件类型START_DOCUMENT,START_TAG,TEXT,END_TAG,END_DOCUMENT 自己编写相应的事件处理操作。区别在于一个是主动提取和事件触发。
PULL解析通过XmlPullParser的 getEventType和next 方法,主动获取事件类型(即你可以随时停止解析操作);
SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,只要开始必定就要解析完整个文档才会结束;
解析XML步骤:
1. 创建解析器工厂
2. 创建解析器
3. 获取输入流
4. 解析(过程中附带自己的操作)
总结了这些应该只是给已经知道的人好记忆 初学者应该难得理解 还是开启传送门把
http://blog.csdn.net/leorowe/article/details/6841375 (关于SAX与PULL的区别)
以下是自己写的例子
主要功能是把XML解析后重新输出来
贴代码!
MainActivity.java
DOMParse.java
PullParse .java
SAXParse.java
DOM方式解析XML
DOM解析的工作方式: 先将整个文档装入内存,解析成Document格式,接下来跟解析html一样将文档拆分成文档树, document,element, node,可以自己搜索 获取内容 存下来, 总体来说感觉比较自由, 因为整个文档都在内存中随机存取。
PULL 和SAX方式
PULL,SAX解析的方式是事件触发同步解析,即解析器读到哪里,就对哪里进行处理。由于采用的是流式解析,这就说明它们不能像DOM那样随机访问XML的其中任意一个节点,只能循序解析。
PULL,SAX都是基于事件机制,通过判断事件类型START_DOCUMENT,START_TAG,TEXT,END_TAG,END_DOCUMENT 自己编写相应的事件处理操作。区别在于一个是主动提取和事件触发。
PULL解析通过XmlPullParser的 getEventType和next 方法,主动获取事件类型(即你可以随时停止解析操作);
SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,只要开始必定就要解析完整个文档才会结束;
解析XML步骤:
1. 创建解析器工厂
2. 创建解析器
3. 获取输入流
4. 解析(过程中附带自己的操作)
总结了这些应该只是给已经知道的人好记忆 初学者应该难得理解 还是开启传送门把
SAX、DOM、PULL的比较
http://book.51cto.com/art/201211/367725.htm (比较经典,分类清楚)
XML解析中SAX和XMLpull的区别http://blog.csdn.net/leorowe/article/details/6841375 (关于SAX与PULL的区别)
以下是自己写的例子
主要功能是把XML解析后重新输出来
贴代码!
<span style="font-size:24px;"><?xml version="1.0" encoding="utf-8"?> <persons> <person id="1" type="aaa"> <name>刘备</name> <age>12</age> </person> <person id="2"> <name>刘欢</name> <age>14</age> </person> <person id="3"> <name>李明</name> <age>15</age> </person> </persons></span>
MainActivity.java
<span style="font-size:24px;">package com.aaa.parsexml; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { TextView tv_text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } public void dom(View view){ InputStream is; try { is = getAssets().open("aaa.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(is); Element root = document.getDocumentElement(); StringBuffer text=new StringBuffer(""); DOMParse.parseByDOM(root,text,0); tv_text.setText(text.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(this, "未找到该文件,请确认文件是否存在!", Toast.LENGTH_LONG).show(); } catch (ParserConfigurationException e) { e.printStackTrace(); Toast.makeText(this, "初始化解析程序出错,请重新启动!", Toast.LENGTH_LONG).show(); } catch (SAXException e) { e.printStackTrace(); Toast.makeText(this, "解析XML出错,请检查XML是否正确!", Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "打开文件出错!", Toast.LENGTH_LONG).show(); } } public void init() { tv_text=(TextView)findViewById(R.id.tv_text); } public void sax(View view){ InputStream is=null; try { is = getAssets().open("aaa.xml"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String text=SAXParse.parseBySAX(is); tv_text.setText(text); } public void pull(View view){ InputStream is=null; try { is = getAssets().open("aaa.xml"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String text=PullParse.parseByPull(is, this); tv_text.setText(text); } }</span>
DOMParse.java
<span style="font-size:24px;">package com.aaa.parsexml; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @ClassName: DOMParse * @Package: com.aaa.parsexml; * @Description: tool class to parse XML by DOM * @author aaa */ public class DOMParse { //parse xml by recursion public static void parseByDOM(Node node,StringBuffer sb,int level) { StringBuffer indent=new StringBuffer(); for(int i=0;i<level;i++) { indent.append("\t"); } sb.append(indent); //get element node filter out the blank nodes if(node.getNodeType()==Node.ELEMENT_NODE) { // print start element <aaa att="xxx"> sb.append("<"+node.getNodeName()); if(node.hasAttributes()) { NamedNodeMap nnm=node.getAttributes(); for(int i=0;i<nnm.getLength();i++) { String key=nnm.item(i).getNodeName(); String value=nnm.item(i).getNodeValue(); sb.append(" "+key+"=\""+value+"\""); } } sb.append(">"); //Recursive print sub node boolean hasTextNode=false; NodeList list=node.getChildNodes(); for(int i=0;i<list.getLength();i++) { Node subNode=list.item(i); //if sub node is text node or blank node print it and print end element if(subNode.getNodeType() == Node.TEXT_NODE && (!subNode.getTextContent().matches("\\s+"))) { sb.append(node.getTextContent()); sb.append("</"+node.getNodeName()+">"); hasTextNode=true; }else if (subNode.getNodeType() == Node.ELEMENT_NODE){ //if sub node is a element node recursion! sb.append("\n"); parseByDOM(subNode, sb, level+1); } } //print end element </aaa> if(!hasTextNode) { sb.append("\n"); sb.append(indent); sb.append("</"+node.getNodeName()+">"); } } } }</span>
PullParse .java
<span style="font-size:24px;">package com.aaa.parsexml; import java.io.IOException; import java.io.InputStream; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import android.content.Context; import android.util.Log; import android.widget.Toast; /** * @ClassName: PullParse * @Package: com.aaa.parsexml; * @Description: tool class to parse XML by pull * @author aaa */ public class PullParse { public static String parseByPull(InputStream is,Context context){ StringBuffer xmlString=null; try { //create fatory create parser and parse XML XmlPullParserFactory xppf=XmlPullParserFactory.newInstance(); XmlPullParser xpp=xppf.newPullParser(); xpp.setInput(is, "UTF-8"); //parse xml by event int type=xpp.getEventType(); while(type!=XmlPullParser.END_DOCUMENT) { switch(type) { case XmlPullParser.START_DOCUMENT: xmlString=new StringBuffer(); xmlString.append("=====START PULL PARSER====="); xmlString.append("\n"); break; case XmlPullParser.START_TAG: Log.i("pull parser","start tag"); xmlString.append("<"); xmlString.append(xpp.getName()); for(int i=0;i<xpp.getAttributeCount();i++){ xmlString.append(" "); xmlString.append(xpp.getAttributeName(i)); xmlString.append("=\""); xmlString.append(xpp.getAttributeValue(i)); xmlString.append("\""); } xmlString.append(">"); break; case XmlPullParser.TEXT: xmlString.append(xpp.getText()); break; case XmlPullParser.END_TAG: Log.i("pull parser","end tag"); xmlString.append("</"); xmlString.append(xpp.getName()); xmlString.append(">"); break; case XmlPullParser.END_DOCUMENT: xmlString.append("\n"); xmlString.append("=====END PULL PARSER====="); break; } type = xpp.next(); } } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xmlString.toString(); } }</span><span style="font-size: 14px;"> </span>
SAXParse.java
<span style="font-size:24px;">package com.aaa.parsexml; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @ClassName: SAXParse * @Package: com.aaa.parsexml; * @Description: tool class to parse XML by sax * @author aaa */ public class SAXParse{ private static StringBuffer sb; public static String parseBySAX(InputStream is){ //create fatory create parser and parse XML SAXParserFactory spf=SAXParserFactory.newInstance(); try { sb=new StringBuffer(); SAXParser sp=spf.newSAXParser(); //parse xml inputstream by DefaultHandler sp.parse(is, saxHandler); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } static DefaultHandler saxHandler =new DefaultHandler() { public void startDocument() throws SAXException { sb.append("=====START SAX PARSER====="); sb.append("\n"); }; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //add Element start tag sb.append("<"); sb.append(localName); //add element attributes for(int i=0;i<attributes.getLength();i++) { sb.append(" "); sb.append(attributes.getLocalName(i) + "=" + "\""+ attributes.getValue(i) +"\""); } sb.append(">"); }; public void characters(char[] ch, int start, int length) throws SAXException { //add text node String str = new String(ch,start,length); sb.append(str); //notice : text node content space : " ",enter : "\n" ,table : "\t"; //if you find the output text content some extra blank, then they are //you can use the trim() function in class String to clear it; }; public void endElement(String uri, String localName, String qName) throws SAXException { //end tag sb.append("</"); sb.append(localName); sb.append(">"); }; public void endDocument() throws SAXException { sb.append("\n"); sb.append("=====END SAX PARSER====="); }; }; }</span><span style="font-size: 22px;"> </span>
相关文章推荐
- 详解android解析Xml的三种方式——DOM、SAX以及XMLpull
- Android解析XML三种方式(PULL、SAX、DOM)
- android解析XML总结(SAX、Pull、Dom三种方式)
- 详解Android解析Xml的三种方式——DOM、SAX以及XMLpull
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML的三种方式(DOM,SAX,PULL)
- android解析XML总结(SAX、Pull、Dom三种方式)
- 三种方式解析XML(DOM,Pull,Sax,并带文件编码识别).........................by 私念
- 详解android解析Xml的三种方式——DOM、SAX以及XMLpull
- android解析XML总结(SAX、Pull、Dom三种方式) <转载>
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)
- 解析xml的三种方式DOM/SAX/PULL
- 在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)
- android解析XML总结(SAX、Pull、Dom三种方式)附带DOM4J、JDOM
- XML---android解析XML总结(SAX、Pull、Dom三种方式)
- android解析XML总结(SAX、Pull、Dom三种方式)