首先,我們新建一個類,存放天氣信息
/*
?*?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;
?}
/*
?*?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;
?}