DOM PULL SAX 三种方式解析XML

先介绍三种方式的特点, 

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>























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值