Processing XML with Perl | Michel Rodriguez |
Introduction to XML::Twig | Example: Data Base Integration |
Example: an HTML converter
Create an HTML document listing all available wines, sorted within each category. The field to sort on is passed as the argument of the script.
#!/bin/perl -w use strict; use XML::Twig; use CGI qw(:standard); my $sort_on= shift; die "invalid sort field $sort_on" unless( $sort_on=~/(year|rating|price)/); my $t= new XML::Twig( TwigHandlers => { category => \&category}, StartTagHandlers => { class => \&class }, ); print start_html( "Wine list"); print h1( "Wine list"); print '<table border="1">'; print Tr( td( 'Winery'), td( 'Type'), td( 'Year'), td( 'Rating'), td( 'Price')); $t->parsefile( "wine.xml"); print '</table>'; print end_html; exit; sub class { my( $t, $class)= @_; # just print the class name in a h2, accross the whole table my $name= $class->att( 'name'); $name= join ' ', map { ucfirst } split / /, $name; print Tr( td( {colspan => 5}, h2( $name))); } sub category { my( $t, $category)= @_; my $name= $category->att( 'name'); $name= join ' ', map { ucfirst } split / /, $name; print Tr( td( {colspan => 5}, b( $name))); # get the rows my @items= $category->children( 'item'); my @rows; foreach my $item (@items) { # skip wines that are not in stock next unless( $item->first_child( 'stock')->text); my $row; $row->{winery} = $item->first_child( 'winery')->text ; $row->{type} = $item->first_child( 'type')->text ; $row->{type} .= ' (' . $item->first_child( 'type')->att( 'aoc') . ')' if( $item->first_child( 'type')->att( 'aoc')); $row->{year} = $item->first_child( 'year')->text ; $row->{rating} = $item->first_child( 'rating')->text ; $row->{price} = $item->first_child( 'price')->text ; push @rows, $row; } # sort the rows using the Schwartzian transform @rows= map { $_->[1]} sort { $b->[0] <=> $a->[0] } map { [$_->{$sort_on}, $_] } @rows; # print the table foreach my $row (@rows) { print Tr( td( $row->{winery}), td( $row->{type}), td( $row->{year}), td( $row->{rating}), td( $row->{price})); } $t->purge; } |
Introduction to XML::Twig | Example: Data Base Integration |