首先,我们新建一个类,存放天气信息
/*
* 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;
}