日期:2014-05-17  浏览次数:20732 次

Android也架构之四:门面模式解析获取的html代码

大家好,一个星期没有写博客了,最近在找工作,面试中啊。。。。

上一篇文章《Android也架构之三:简单工厂模式优化网络请求》中,我们知道了如何通过简单工厂模式去获取网络的内容,又知道了如何把这些内容显示在我们的界面上,但是我们拿到的都是html文本内容。这篇文章中,我们将讲到了如何去解析这些html,获得我们想要的内容。

通过这篇文章的学习,你将学会一下几个知识点:

1,门面模式在android中的应用

2,学会使用jsoup框架解析html。


废话少说,我们首先来看下什么是门面模式:

门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。    

门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

在我们一下的例子中,门面是facade.java,子系统有网络系统(从网络中获取响应数据)和数据解析系统(解析html代码)


网络系统的代码可以直接看上一篇文章《Android也架构之三:简单工厂模式优化网络请求》的代码,这里就不在贴出。

首先我们来看一下html数据解析代码:

package com.devchina.analyze;

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
 * @title HTML解析类
 * @description 描述
 * @company 探索者网络工作室(www.tsz.net)
 * @author michael Young (www.YangFuhai.com)
 * @version 1.0
 * @created 2012-9-10
 */
public class HtmlAnalyze implements DataAnalyze {

	@Override
	public List<String> getTitleList(String strData) {
		List<String> strList = new ArrayList<String>();
		Document doc = Jsoup.parse(strData,"utf-8");//获得document
		Element content = doc.body();//获得body
		Elements links = content.getElementsByTag("a");//获得所有的超级链接
		
		for (Element link : links) { //遍历所有的超级链接
		  String linkHref = link.attr("href");
		  String linkText = link.text();
		  
		  System.out.println("---------linkHref:"+linkHref);
		  System.out.println("---------linkText:"+linkText);
		  
		  if(linkHref.startsWith("forum.php?mod=viewthread")) //如果是文章的超级链接的话,添加到list 返回
			  strList.add(linkText);
		  
		}
		
		return strList;
	}

}

数据解析接口和数据解析工厂类(为什么用工厂,可以查看上一篇