#!/usr/bin/perl use strict ; use DBI; use XML::Twig; # prepare database my $dbh=dbh(); # connect init(); $dbh->do('USE db123'); #$dbh->do('DELETE FROM pois'); # sql my $sql = 'REPLACE INTO pois VALUES (?,?,?,?,?,?)'; my $sth = $dbh->prepare($sql); # set up handler my $t = XML::Twig->new( twig_handlers => { 'node' => \&node } ); # parse xml my $xml = do { local $/; }; $t->parse($xml); #$t->parsefile('.osm'); sub node { my ($t,$elt) = @_; my %data=( 'id' => $elt->att('id'), 'lat' => $elt->att('lat'), 'lon' => $elt->att('lon'), ); for my $tag ( $elt->children() ){ $data{$tag->att('k')} = $tag->att('v'); #print $tag->att('k').' = '.$tag->att('v')."\n"; } # update database my @f = map{ $data{$_} }('id','lat','lon','name','amenity','operator'); if ($f[3] ne '' && $f[4] ne '' && $f[5] ne ''){ print "-- INSERT --\n". (join "\n",@f). "\n\n"; $sth->execute(@f); } } #### sub init { $dbh-> do('CREATE DATABASE IF NOT EXISTS db123 DEFAULT CHARACTER SET latin1 COLLATE latin1_german2_ci'); $dbh->do('USE db123'); $dbh->do('CREATE TABLE IF NOT EXISTS pois ( id BIGINT(20) UNSIGNED NOT NULL, lat FLOAT(10,7) NOT NULL, lon FLOAT(10,7) NOT NULL, name VARCHAR(255) COLLATE utf8_bin NOT NULL, amenity VARCHAR(255) COLLATE utf8_bin NOT NULL, operator VARCHAR(255) COLLATE utf8_bin NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin'); } sub dbh { my $dsn = "DBI:mysql:database=;host=localhost"; my $dbh = DBI->connect($dsn, 'user', 'pwd', {RaiseError => 1, PrintError => 1}) or die (Error connecting " $DBI::errstr"); } __DATA__