首先,我们新建一个类,存放天气信息

/*

 * Created on 2005-3-8

 *

 * To change the template for this generated file go to

 * Window>Preferences>Java>Code Generation>Code and Comments

 */

package org.exoplatform.portlets.chinaweather.component;

/**

 * @author Administrator

 *

 * To change the template for this generated type comment go to

 * Window>Preferences>Java>Code Generation>Code and Comments

 */

public class Weather {

 private String city;

 private String state;

 private String temperature;

 private String time;

 private String wind;

 private String windpower;

 private long UpdateTime;

 /**

  * @return

  */

 public String getTemperature() {

  return temperature;

 }

 /**

  * @return

  */

 public String getTime() {

  return time;

 }

 /**

  * @return

  */

 public String getWind() {

  return wind;

 }

 /**

  * @return

  */

 public String getWindpower() {

  return windpower;

 }

 /**

  * @param string

  */

 public void setTemperature(String string) {

  temperature = string;

 }

 /**

  * @param string

  */

 public void setTime(String string) {

  time = string;

 }

 /**

  * @param string

  */

 public void setWind(String string) {

  wind = string;

 }

 /**

  * @param string

  */

 public void setWindpower(String string) {

  windpower = string;

 }

 /**

  * @return

  */

 public long getUpdateTime() {

  return UpdateTime;

 }

 /**

  * @param l

  */

 public void setUpdateTime(long l) {

  UpdateTime = l;

 }

 /**

  * @return

  */

 public String getState() {

  return state;

 }

 /**

  * @param string

  */

 public void setState(String string) {

  state = string;

 }

 /**

  * @return

  */

 public String getCity() {

  return city;

 }

 /**

  * @param string

  */

 public void setCity(String string) {

  city = string;

 }

}

具体的解析代码为:

private Weather parserWeather() throws Exception {

  Weather w = new Weather();

  try {

   //Parser parser =

   // new Parser("file://localhost/I:/projects/query.html");

   Parser parser =

    new Parser("http://weather.news.sohu.com/query.php?city=镇江");

   

   parser.setEncoding("GBK");

   Node nodes[] = parser.extractAllNodesThatAre(TableTag.class);

   TableTag table = (TableTag) nodes[3];

   //temperature

   StringNode[] stringNodes = table.digupStringNode("镇江");

   StringNode name = stringNodes[0];

   w.setCity(name.toPlainTextString());

   CompositeTag td = (CompositeTag) name.getParent();

   CompositeTag tr = (CompositeTag) td.getParent();

   int columnNo = tr.findPositionOf(td);

   TableColumn nextColumn = (TableColumn) tr.childAt(5);

   Node expectedName = nextColumn.childAt(0);

   Node expectedName2 = nextColumn.childAt(2);

   //System.out.println(expectedName.getText());

   //System.out.println(expectedName2.getText());

   w.setState(expectedName.getText());

   w.setTemperature(expectedName2.getText());

   //time

   stringNodes = table.digupStringNode("时间");

   name = stringNodes[0];

   //System.out.println(name.toPlainTextString());

   String time =

    name

     .toPlainTextString()

     .substring(4, name.toPlainTextString().length())

     .trim();

   //System.out.println(time);

   w.setTime(time);

   //wind

   stringNodes = table.digupStringNode("风向");

   name = stringNodes[0];

   //System.out.println(name.toPlainTextString());

   String wind =

    name

     .toPlainTextString()

     .substring(4, name.toPlainTextString().length())

     .trim();

   //System.out.println(wind);

   w.setWind(wind);

   //wind power

   stringNodes = table.digupStringNode("风力");

   name = stringNodes[0];

   //System.out.println(name.toPlainTextString());

   String windpower =

    name

     .toPlainTextString()

     .substring(4, name.toPlainTextString().length())

     .trim();

   //System.out.println(windpower);

   w.setWindpower(windpower);

   w.setUpdateTime(System.currentTimeMillis());

  } catch (ParserException e) {

   e.printStackTrace();

  }

  return w;

 }

解析出来的代码必须做缓存处理,

private static long TIME_TO_LIVE = 1000 * 60 * 60 * 12;

 private Weather loadWeather() throws Exception {

  Weather weather = weather = (Weather) cache_.get("chinaweather");

  long currentTime = System.currentTimeMillis();

  if (weather != null

   && currentTime < (weather.getUpdateTime() + TIME_TO_LIVE)) {

   cache_.remove("chinaweather");

   weather = null;

  }

  if (weather == null) {

   synchronized (cache_) {

    weather = parserWeather();

    cache_.put("chinaweather", weather);

   }

  }

  return weather;

 }