in reply to creating xml from cgi
One trick you can use is array slicing to clean up the element extraction. Then splicing each group of predictions from the data cleans up the logic of the generation loop somewhat:
use strict; use warnings; use LWP::Simple qw(get); my $url = "http://www.oceanoutlook.com.au/table/perth.html"; my $source = get($url); use HTML::Tree; my $tree = HTML::Tree->new(); $tree->parse($source); my @tds = $tree->look_down( '_tag', 'td' ); my $month = $tds[4]->as_text (); my @headers = ('Date', map {$_->as_text} @tds[5 .. 14]); my @data = map {$_->as_text} @tds[16 .. $#tds - 1]; $_ eq 'Dir' and $_ = "Swell Direction" for @headers; # Output to xml use XML::Writer; my $writer = new XML::Writer(DATA_MODE => 1, DATA_INDENT => 4); $writer->startTag("doc", class => "simple"); $writer->dataElement( 'title', "Swell Forecast"); $writer->dataElement( 'month', $month); while (@data >= @headers) { my ($date, $dir, @values) = splice @data, 0, @headers; $writer->startTag ("prediction", date => $date); $writer->dataElement ('title', $date); $writer->dataElement ('item', $dir, name => $headers[1]); $writer->startTag ("swell_height"); $writer->dataElement ('unit', 'meters'); $writer->dataElement ('item', $values[$_], name => $headers[$_ + +2]) for 0 .. 2; $writer->endTag(); $writer->startTag ("peak_period"); $writer->dataElement ('unit', 'seconds'); $writer->dataElement ('item', $values[$_], name => $headers[$_ + +2]) for 3 .. 6; $writer->endTag(); $writer->startTag ("wind"); $writer->dataElement ('unit', 'knots'); $writer->dataElement ('item', $values[$_], name => $headers[$_ + +2]) for 7 .. 9; $writer->endTag(); $writer->endTag(); # Close prediction } $writer->endTag(); # Close doc $writer->end(); exit;
|
|---|