pull,SAX和DOM解析的区别

  网上关于这三种解析方式的优缺点对比已经很多了,这里我只展示代码的实现过程,加深代码印象:

  代码结构如下图所示:

1.users.xml的文件就是待解析的文件:

<users>
    <user id="1">
        <name>wuxianglong</name>
        <password>199098</password>
    </user>
    <user id="2">
        <name>wuwenyuan</name>
        <password>199189</password>
    </user>
</users>


2.user的代码就比较简单了:

public class User {

	public int id;
	public String name;
	public String password;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", password=" + password
				+ "]";
	}

3.首先是pull解析的代码实现:

public class PullParser {
	public static List<User> getUser(InputStream inputStream) throws Exception {

		List<User> users = null;
		User user = null;
		XmlPullParser parser = Xml.newPullParser();
		parser.setInput(inputStream, "UTF-8");

		int event = parser.getEventType();
		while (event != XmlPullParser.END_DOCUMENT) {
			switch (event) {
			case XmlPullParser.START_DOCUMENT:
				users = new ArrayList<User>();
				break;
				
			case XmlPullParser.START_TAG:
				if ("user".equals(parser.getName())) {
					user = new User();
					user.setId(Integer.parseInt(parser.getAttributeValue(0)));
				}
				if (user != null) {
					if ("name".equals(parser.getName())) {
						user.setName(parser.nextText());
					}
					if ("password".equals(parser.getName())) {
						user.setPassword(parser.nextText());
					}
				}
				break;
				
			case XmlPullParser.END_TAG:
				if ("user".equals(parser.getName())) {
					users.add(user);
					user = null;
				}
				break;
			}
			event = parser.next();
		}

		return users;

	}
}

4.然后是SAX的解析代码实现:

public class SaxHandler extends DefaultHandler {

	private ArrayList<User> users;
	private User user;
	private String content;
	
	/**
	 * @param users
	 */
	public SaxHandler(ArrayList<User> users) {
		this.users = users;
	}
	
	@Override
	public void startDocument() throws SAXException {
		super.startDocument();
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		content = new String(ch, start, length);
		super.characters(ch, start, length);
	}

	@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 {
		if ("user".equals(localName)) {
			user = new User();
			user.setId(Integer.valueOf(attributes.getValue("id")));
		}
		super.startElement(uri, localName, qName, attributes);
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if ("name".equals(localName)) {
			user.setName(content);
		} else if ("password".equals(localName)) {
			user.setPassword(content);
		} else if ("user".equals(localName)) {
			users.add(user);
		}
		
		super.endElement(uri, localName, qName);
	}
}

5.最后是Dom解析的代码实现:

public class DomParser {
	public static List<User> getUser(InputStream inputStream) throws Exception{
		
		List<User> users = new ArrayList<User>();
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document =builder.parse(inputStream);
		Element root = document.getDocumentElement();        //获取root根节点
		NodeList nodes = root.getElementsByTagName("user");   //获取第一个父结点
		
		//遍历user结点
		for(int i = 0;i < nodes.getLength(); i++){
			User user = new User();
			Element node = (Element) nodes.item(i);
			user.setId(Integer.parseInt(node.getAttribute("id")));
			NodeList childNodes = node.getChildNodes();
			
			//遍历user下的所有子节点
			for(int j = 0;j < childNodes.getLength();j++){
				Node ChildNode = childNodes.item(j);
				if(ChildNode.getNodeType() == Node.ELEMENT_NODE){
					Element cNode = (Element) ChildNode;
					if("name".equals(cNode.getNodeName())){
						user.setName(cNode.getFirstChild().getNodeValue());
					}else if("password".equals(cNode.getNodeName())){
						user.setPassword(cNode.getFirstChild().getNodeValue());	
					}
						
				}
				users.add(user);
			}
			inputStream.close();
		}
		return users;
		
	}
}

6.调用他们就很简单了,只是定义了一个垂直的LinearLayout的布局,并实现三个按钮分别对应pull,sax,dom解析按钮,然后底下是一个解析显示结果的TextView。

  主要功能实现的代码是:

public class MainActivity extends Activity implements OnClickListener {

	private Button btn_sax;
	private Button btn_pull;
	private Button btn_dom;
	private TextView tv_content;
	private ArrayList<User> users;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		btn_sax = (Button) findViewById(R.id.btn_sax);
		btn_pull = (Button) findViewById(R.id.btn_pull);
		btn_dom = (Button) findViewById(R.id.btn_dom);
		tv_content = (TextView) findViewById(R.id.tv_content);

		btn_sax.setOnClickListener(this);
		btn_pull.setOnClickListener(this);
		btn_dom.setOnClickListener(this);

		users = new ArrayList<User>();
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_sax:

			doSAX(); // 进入解析

			break;
		case R.id.btn_pull:

			doPull();

			break;
		case R.id.btn_dom:

			doDom();
			
			break;
		}
	}

	/**
	 * 开始dom解析
	 */
	private void doDom() {
		
		try {
			InputStream input = this.getClass().getClassLoader()
					.getResourceAsStream("users.xml");
			List<User> users = DomParser.getUser(input);
			
			String domUserInfo = "";

			for (User user : users) {
				domUserInfo += user.toString();
			}
			tv_content.setText(domUserInfo);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 开始pull解析
	 */
	private void doPull() {

		try {
			InputStream input = this.getClass().getClassLoader()
					.getResourceAsStream("users.xml");
			new PullParser();
			List<User> users = PullParser.getUser(input);

			String PullUserInfo = "";

			for (User user : users) {
				PullUserInfo += user.toString();
			}
			tv_content.setText(PullUserInfo);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 开始sax解析
	 */
	private void doSAX() {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			XMLReader reader = parser.getXMLReader();
			SaxHandler handler = new SaxHandler(users);
			reader.setContentHandler(handler);
			reader.parse(
			// new InputSource(this.getAssets().open("users.xml")));
			new InputSource(MainActivity.this.getClassLoader()
					.getResourceAsStream("users.xml")));
			
			String SaxUserInfo = "";

			for (User user : users) {
				SaxUserInfo += user.toString();
			}
			tv_content.setText(SaxUserInfo);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

解析过程大体就完成了,最后看下结果吧(只选取了一个结果展示):




附上代码下载地址:

                                                             点击这里


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值