您的位置:首页 > 编程语言 > Java开发

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. 解析(过程中附带自己的操作)

总结了这些应该只是给已经知道的人好记忆 初学者应该难得理解 还是开启传送门把

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml DOM PULL java SAX