首先,我們新建一個類,存放天氣信息
/*
?*?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=鎮(zhèn)江
"
);
???
???parser.setEncoding(
"
GBK
"
);
???Node?nodes[]?
=
?parser.extractAllNodesThatAre(TableTag.
class
);
???TableTag?table?
=
?(TableTag)?nodes[
3
];
???
//
temperature
???StringNode[]?stringNodes?
=
?table.digupStringNode(
"
鎮(zhèn)江
"
);
???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;
?}