Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11979[/thread]

xml2sql für Dummies Frage



<< >> 4 Einträge, 1 Seite
sequester01
 2008-06-05 13:23
#110761 #110761
User since
2006-10-02
7 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe bisher nur kleine Perlscripte geschrieben und bin leider auch kein Programmierer - immer nur kleine Perl, Bash oder Win Batch Skripte geschrieben.
Ich möchte mein Wissen aber aufgrund eines Problemes vertiefen, welches ich gerne lösen möchte. Daher nerve ich vermutlich mit einer totalen Dummie-Frage:

Ziel ist es aus einer gegebenen XML Datei die Werte in MYSQL zu bringen.

Die XML:
Code: (dl )
1
2
3
4
5
6
7
8
9
<Absatz>
<job id="3245" jobName="Ware1">
<sales Group="Personal" id="0"/>
<production Ausgabe="Tor1"/>
<ware quality="Standard" category="Karton"/>
<versand LieferTyp="196" ProductID="148" AddressID="373"/>
<billing AddressID="366" AddressField1="" AddressField2="" AddressField3="" AddressField4="" AddressField5=""/>
</job>
</Absatz>


Eine XML = ein Datensatz.
In einem Ordner liegen x-beliebige Datein. Jede davon soll als ein Eintrag in einen MySQL Server. Wenn ein Wert (z. B. LieferTyp des versand) nicht existiert, dann sollte das Script eine neue Spalte anlegen.
Das Handling der Dateien ist kein Problem. Aber das mit SQL ist absolutes Neuland - nur irgendwann fängt ja jeder einmal an :-)
Hat jemand Lust mir ein Dummy Script zu zeigen, oder eine Buchempfehlung auszusprechen, wie ich das Lösen kann? Vielleicht hat jemand ein ähnliches Problem gehabt und hat somit eine fast passende Lösung? Herr Goggel hat mir nicht wirklich helfen können, da die Lösungen bereits auf bestehendes Wissen aufbaut.
Ich hatte bereits mit Perldoc versucht weiterzukommen, und mir die einzelnen Werte erst einmal nur anzuzeigen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl
use XML::Parser;
my $zeiger = new XML::Parser ();

sub anfang
{
$wert_des_zeigers = shift;
$starttag= shift;
print "<$starttag>";
print "\n";
}
sub anfanga
{
$wert_des_zeigers = shift;
$starttag= shift;
#chomp $starttag;
print "Anfanga:$starttag";
#print "\n";
}
sub ende
{
($wert_des_zeigers,$endtag) = @_;
print "Ende: $endtag\n";
}
sub inhalt
{
($wert_des_zeigers,$inhalt)=@_;
print " $inhalt";
}

$zeiger->setHandlers (Start => \&anfanga,End => \&ende);
$zeiger->parsefile ("c:\\test.xml");


Aber es gab eigentlich nur wirrwar. Ich finde die XML auch eigenartig, aber so kommt die aus einer Software heraus, die ich nicht ändern kann.

Danke im Voraus,

Seq
renee
 2008-06-05 14:26
#110769 #110769
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie ist denn die Datenbank aufgebaut? Welche Informationen sollen in welche Tabellen gespeichert werden?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sequester01
 2008-06-05 14:41
#110771 #110771
User since
2006-10-02
7 Artikel
BenutzerIn
[default_avatar]
Es gibt noch keine Struktur der DB. Ich kann alles selber anlegen, wie ich möchte.
Meine Idee ist es, vorerst nur eine Tabelle anzulegen, für jede XML-Datei eine eigene "Zeile" in dieser Tabelle. Jeder Wert soll geschrieben werden, wobei die Anzahl der Werte pro XML varieren kann. Auch ob ein wert gefüllt ist oder leer ("") ist beliebig. Kommt ein neuer Wertname, soll eine neue Spalte erzeugt werden.

In diesem Beispiel wären die Tags (das meinte ich bisher mit Werte):
job id,jobName,sales Groupsales ID, production Ausgabe,ware quality,category, versand LieferTyp,ProductID, AddressID, billing AddressID, AddressField1, AddressField2, AddressField3, AddressField4, AddressField5.
Jeder dieser Tags soll also eine Spalte sein.
Etwas unglücklich bin ich mit der XML, da z. B. job nicht als einzelnes Tag steht.
Schöner wäre
<Absatz>
<job>
<id="3245" jobName="Ware1">
<sales>
<Group="Personal" id="0"
</Sales>
</job>.... usw.


Ist es aber nicht.

Wenn ich das gerafft habe, soll eine neue Tabelle mit anderen XML-Dateien enstehen. Der Querverbinder wäre dann das Tag "job id" - - aber das kommt erst danach, wenn ich den ersten Schritt geschafft habe.

Gruß,
Seq
murphy
 2008-06-05 19:39
#110789 #110789
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Für einfache kleine XML-Dateien ist es vermutlich praktischer, CPAN:XML::Simple zu verwenden und zum Datenbankzugriff benutzt man natürlich CPAN:DBI.

Du musst dann nur eine Datenbankverbindung öffnen, jede Datei einlesen, über die Schlüssel des entstehenden Hashes iterieren, für jeden Schlüssel gegebenenfalls eine Tabellenspalte anlegen und dann den Datensatz in die Datenbank schreiben. Wenn das resultierende Skript mehr als 50 Zeilen braucht, machst Du bestimmt etwas falsch ;-)

Es ist vielleicht noch anzumerken, dass es im Allgemeinen keine so gute Idee ist, die Struktur einer Datenbanktabelle laufend zu verändern, da diese Operation sehr teuer sein kann. Ausserdem werden solche strukturellen Veränderungen von unterschiedlichen Datenbankservern unterschiedlich gehandhabt. Wenn Du die Datenbank aber nur einmal befüllen willst und wirklich nicht weißt welche Tags in den XML-Dateien vorkommen können, ist das schon akzeptabel.
When C++ is your hammer, every problem looks like your thumb.
<< >> 4 Einträge, 1 Seite



View all threads created 2008-06-05 13:23.