Hallo,

ich habe vor einiger Zeit ein kleines Perl Skript gefunden, das vcf in das XML Format der Fritzbox übersetzt. Damit es mit dem Export aus dem Telefonbuch meines Android 5 funktioniert musste ich es etwas modifizieren. Zur Verwendung muss das Telefonbuch aus dem Handy in eine vcf Datei exportiert und auf einen Rechner kopiert werden, der Perl installiert hat. Dort einfach den Namen der vcf Datei als Aufrufparameter mitgeben. Die Ausgabe in XML erfolgt auf STDOUT und kann bei Gefallen in eine xml Datei umgeleitet werden.Diese kann über die Weboberfläche der Fritzbox ins Telefonbuch importiert werden. Die Fritzbox ersetzt dabei ein eventuell bereits bestehendes Telefonbuch mit dem neuen.

PS.: Danke an den unbekannten Autor des Skriptes, das ich damals als Grundlage verwenden konnte.


Hier ist meine Version des Perl-Skriptes:

#!/usr/bin/perl -w
use warnings;
use strict;
use MIME::QuotedPrint;
use XML::LibXML;
use XML::LibXML::PrettyPrint;

my $inputFile;
foreach my $arg (@ARGV) {
#print $arg, "\n";
$inputFile = $arg;
}

$inputFile = shift;
open(VCARD, $inputFile)
or die "Can't open $inputFile";

my $newContactFlag = 0;
my %contactHash;
my $name;
my $i = 0;

# Input section
my $doc = XML::LibXML::Document->new('1.0', 'utf-8');

my $root = $doc->createElement("phonebooks");
my $pb = $doc->createElement("phonebook");
$root->appendChild($pb);

while()
{
if($_ =~ /^FN[:;](.+)\n$/)
{
$name = decode_qp($1);
chop($name);
$name =~ s/CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE://;
my $cont = $doc->createElement("contact");
my $cat = $doc->createElement("category");
$cat->appendTextNode("0");
$cont->appendChild($cat);
my $pers = $doc->createElement("person");
$cont->appendChild($pers);
my $rn = $doc->createElement("realName");
$rn->appendTextNode("$name");
$pers->appendChild($rn);
my $tel = $doc->createElement("telephony");
$cont->appendChild($tel);
$contactHash{$name} = $cont;
}
elsif( $_ =~ /TEL;(.+):(.+)\r\n$/)
{
$i++;
my $type = lc($1);
my $cont = $contactHash{$name};
foreach my $tel ($cont->findnodes('telephony')){
my $num = $doc->createElement("number");
my $number = $2;
$number =~ s/\+49/0/;
$number =~ s/\-//g;
$num->appendTextNode($number);
$tel->appendChild($num);
$type =~ s/cell/mobile/;
$num->setAttribute('type'=> $type);
$num->setAttribute('vanity'=> "");
$num->setAttribute('prio'=> "1");
}
}

}

close(VCARD);

# Output Section
my $id = 0;
foreach my $key ( sort keys %contactHash )
{
my $cont = $contactHash{$key};
my $tag = $doc->createElement("service");
$cont->appendChild($tag);
$tag = $doc->createElement("setup");
$cont->appendChild($tag);
$tag = $doc->createElement("mod_time");
$tag->appendTextNode("1319558289");
$cont->appendChild($tag);
$tag = $doc->createElement("uniqueid");
$tag->appendTextNode($id);
$cont->appendChild($tag);
$pb->appendChild($cont);
$id++;
}
$doc->setDocumentElement($root);

my $pp = XML::LibXML::PrettyPrint->new(
indent_string => ' ' x4,
element => {
compact => [qw| number category realName mod_time uniqueid | ],
}
);
$pp->pretty_print($doc);
print $doc->toString();


...zur Antwort