码迷,mamicode.com
首页 > 其他好文 > 详细

Xml的三种解析方式

时间:2015-04-04 16:54:35      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:xml解析的三种方法

XML的三种解析方式:DOM、SAX、PULL解析

废话不说上代码:

package com.minimax.xmlparsedemo;

import java.io.InputStream;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.content.res.AssetManager;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
/**
 * 这个例子讲述了XML的解析和生成
 * 解析使用了四种方式
 * 1.DOM解析
 * 2.SAX解析
 * 3.PULL解析
 * 4.
 * @author Administrator
 */
public class MainActivity extends Activity {
    private AssetManager mAssess;
    private InputStream is;
    private DomXmlService mDomService;
    private SaxXmlService mSaxService;
    private PullXmlService mPullService;
    private List<Person> persons;
    private static final String TAG="domparse";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView tv=(TextView) findViewById(R.id.tv);
		try {
			mAssess=getAssets();
			is=mAssess.open("persons.xml");
			//DOM解析
//			mDomService=new DomXmlService();
//			persons=mDomService.getPersonsByParseXML(is);
			//SAX解析
//			mSaxService=new SaxXmlService();
//			persons=mSaxService.getPersonsByParseXML(is);
			//PULL解析
			mPullService=new PullXmlService();
			persons=mPullService.getPersonsByParseXML(is);
			//测试
			String str="";
			for(Person p:persons){
				Log.i(TAG, p.toString());
				str+=p.toString();
				System.out.println("msg.."+p.toString());
			}
			tv.setText(str);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}


package com.minimax.xmlparsedemo;

public class Person {

	public int id;
	public int age;
	public String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
	@Override
	public String toString() {
		return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";
	}
	
}

package com.minimax.xmlparsedemo;

import java.io.InputStream;
import java.util.List;


public interface IXmlService {
    //因为三种方法都要去解析XML所以可以使三种方法都实现该接口即可
	public List<Person> getPersonsByParseXML(InputStream in) throws Exception;
	//创建出XML文档
	public String getXMLDocumentByPersons(List<Person> persons);
	
}

package com.minimax.xmlparsedemo;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomXmlService implements IXmlService {

	@Override
	public List<Person> getPersonsByParseXML(InputStream is) throws Exception {
		// TODO Auto-generated method stub
		List<Person> persons=null;
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder builder=factory.newDocumentBuilder();
		Document document=builder.parse(is);
		//获取的是根元素 persons
		Element root=document.getDocumentElement();
		// 得到一个集合,里面存放在XML文件中所有的person
		NodeList nodelist=root.getElementsByTagName("person");
		// 在这块判断集合是否为空 或者集合的元素个数为0
		if(nodelist==null || nodelist.getLength()==0){
			return null;
		}
		//初始化集合
		persons=new ArrayList<Person>();
		//生成List集合的数据
		for(int i=0;i<nodelist.getLength();i++){
			Element node=(Element) nodelist.item(i);
			Person p=new Person();
			int id=Integer.parseInt(node.getAttribute("id"));
			String name=getAttrText(node, "name");
			String age=getAttrText(node, "age");
			p.setAge(Integer.parseInt(age));
			p.setName(name);
			p.setId(id);
			
			persons.add(p);
			
		}
		return persons;
	}

	public String getAttrText(Element element,String name){
		String content=null;
		//这个方法是获取person节点下面的所有节点
		NodeList nodelist2=element.getChildNodes();
		for(int k=0;k<nodelist2.getLength();k++){
			Node node=nodelist2.item(k);
			//获取节点的名称
			String nodeName=node.getNodeName();
			if(nodeName.equals(name)){
				content=node.getTextContent();
			}
		}
		return content;
	}
	
	
	@Override
	public String getXMLDocumentByPersons(List<Person> persons) {
		// TODO Auto-generated method stub
		return null;
	}

}

package com.minimax.xmlparsedemo;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

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;

/**
 * 不必等到文档加载完毕之后才去解析,SAX解析直接进行解析
 * @author Administrator
 *
 */
public class SaxXmlService implements IXmlService {

	@Override
	public List<Person> getPersonsByParseXML(InputStream in) throws Exception {
		// TODO Auto-generated method stub
		SAXParserFactory factory=SAXParserFactory.newInstance();
		SAXParser parser=factory.newSAXParser();
		MySaxHandler dh=new MySaxHandler();
		parser.parse(in, dh);
		//返回解析之后生成的集合数据
		return dh.getList();
	}

	
	//自定义一个Handler继承自DefaultHandler 然后重写其中的方法
	class MySaxHandler extends DefaultHandler{
        private  List<Person> persons;
        private  String current;
        private  Person person;
        
		@Override
		public void startDocument() throws SAXException {
			// TODO Auto-generated method stub
			super.startDocument();
			persons=new ArrayList<Person>();
		}

		@Override
		public void endDocument() throws SAXException {
			// TODO Auto-generated method stub
			super.endDocument();
		}

		@Override
		public void startElement(String uri, String localName, String qName,
				Attributes attributes) throws SAXException {
			// TODO Auto-generated method stub
			super.startElement(uri, localName, qName, attributes);
			if("person".equals(localName)){
				person=new Person();
				person.setId(Integer.parseInt(attributes.getValue("id")));
			}else if("name".equals(localName) || "age".equals(localName)){
				current=localName;
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			super.endElement(uri, localName, qName);
			if("person".equals(localName)){
				persons.add(person);
			}else if("name".equals(localName) || "age".equals(localName)){
				current=null;
			}
			
		}

		@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			super.characters(ch, start, length);
			String s=new String(ch, start, length);
			if("name".equals(current)){
				person.setName(s);
			}else if("age".equals(current)){
				person.setAge(Integer.parseInt(s));
			}
		}
		
		
		//返回persons
		public List<Person> getList(){
			return persons;
		}
		
		
	}
	
	
	@Override
	public String getXMLDocumentByPersons(List<Person> persons) {
		// TODO Auto-generated method stub
		return null;
	}

}


package com.minimax.xmlparsedemo;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

public class PullXmlService implements IXmlService {

	@Override
	public List<Person> getPersonsByParseXML(InputStream in) throws Exception {
		List<Person> persons=null;
		Person person=null;
		XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
		XmlPullParser parser=factory.newPullParser();
		parser.setInput(in, "utf-8");
		int type=parser.getEventType();
		while(type!=XmlPullParser.END_DOCUMENT){
			String tagName=parser.getName(); 
			switch (type) {
			case XmlPullParser.START_DOCUMENT:
				//创建集合
				persons=new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if("person".equals(tagName)){
					person=new Person();
					String id=parser.getAttributeValue(0);
					person.setId(Integer.parseInt(id));
				}else if("name".equals(tagName)){
					person.setName(parser.nextText());
				}else if("age".equals(tagName)){
					person.setAge(Integer.parseInt(parser.nextText()));
				}
				break;
			case XmlPullParser.END_TAG:
				if("person".equals(tagName)){
					persons.add(person);
					person=null;
				}
				break;
			default:
				break;
			}
			type=parser.next();
		}
		return persons;
	}

	@Override
	public String getXMLDocumentByPersons(List<Person> persons) {
		// TODO Auto-generated method stub
		return null;
	}

}



本文出自 “祝你幸福” 博客,请务必保留此出处http://zhunixingfu.blog.51cto.com/7430537/1628942

Xml的三种解析方式

标签:xml解析的三种方法

原文地址:http://zhunixingfu.blog.51cto.com/7430537/1628942

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!