Data::Dumper::Dumper() gibt die Datenstruktur so aus dass sie mit eval() wieder eingelesen werden kann, da aber $catalog schon die evaluierte Datenstruktur ist, ist Data::Dumper ueberfluessig.Das Beispiel in perldoc XML::Simple erklaert die ganze Funktionsweise doch recht gut, hier das XML-Beispiel:
Die XML-Datei 'beispiel.xml'
<config logdir="/var/log/foo/" debugfile="/tmp/foo.debug">
<server name="sahara" osname="solaris" osversion="2.6">
<address>10.0.0.101</address>
<address>10.0.1.101</address>
</server>
<server name="gobi" osname="irix" osversion="6.5">
<address>10.0.0.102</address>
</server>
<server name="kalahari" osname="linux" osversion="2.0.34">
<address>10.0.0.103</address>
<address>10.0.1.103</address>
</server>
</config>
Wenn ich jetzt beispielsweise eine MySQL-Datenbank mit 2 Tabellen habe, eine fuer die IP-Adressen und eine fuer die Server. Dann koennte das Script zum Importieren in etwa so aussehen
#!/usr/bin/perl use strict;
use warnings;
use XML::Simple qw();
use FindBin;
use MyServerDB;
my $server_db = MyServerDB->connect('dbi:mysql:serverdb', 'user', 'pass');
my $servers_resultset = $server_db->resultset('Servers');
my $config = XML::Simple::XMLin("$FindBin::Bin/beispiel.xml");
foreach my $server_name (keys %{$config->{'server'}}) {
my $server = $config->{'server'}->{$server_name};
my @ip_addresses = ref($server->{'address'}) eq 'ARRAY'
? @{$server->{'address'}}
: $server->{'address'};
my $new_server = $servers_resultset->new({ name => $server_name });
foreach my $ip_address (@ip_addresses) {
$new_server->add_to_ip_addresses($ip_address);
}
}
Das Modul 'MyServerDB' uebernimmt die Aufgabe die Daten in die Datenbank zu schreiben, man muss es selbst erstellt, in diesen Beispiel wuerde das Modul DBIx::Class::Schema als Basisklasse verwenden, fuer jede Datenbanktabelle muessen dann weitere Module erstellt werden, die die Tabellenstruktur beschreiben. Beispiele lassen sich in der Dokumentation von DBIx::Class finden:
http://search.cpan.org/~ash/DBIx-Class/
Die Dokumentation steht am Ende der Seite DBIx::Class::Manual::*Der Quellcode ist nicht weiter getestet, soll nur die Vorgehensweise skizzieren.
Datum: 05.11.2007-17:07
