#!/usr/bin/perl
use strict; use warnings; my $xml = "<Katalog Shopid="1">1,2,3,4,5</Katalog><Katalog Shopid="2">7,8,9,10</Katalog>";
foreach my $shopid(1..5){ my $pattern = "<Katalog Shopid="$shopid">.*?</Katalog>"; print "Suche: $pattern \n"; $xml =~ /($pattern)/; if($1){ print $1 ,"\n"; }else{ print "nix gefunden\n"; } }
bringt als Ergebnis:
pummel@linux:~/data/scripts/artkat> ./extractKatalog.pl Suche: <Katalog Shopid="1">.*?</Katalog> <Katalog Shopid="1">1,2,3,4,5</Katalog> Suche: <Katalog Shopid="2">.*?</Katalog> <Katalog Shopid="2">7,8,9,10</Katalog> Suche: <Katalog Shopid="3">.*?</Katalog> <Katalog Shopid="2">7,8,9,10</Katalog> Suche: <Katalog Shopid="4">.*?</Katalog> <Katalog Shopid="2">7,8,9,10</Katalog> Suche: <Katalog Shopid="5">.*?</Katalog> <Katalog Shopid="2">7,8,9,10</Katalog>
ich erwarte eigentlich bei den shopids ab 3 ein 'nix gefunden' Lasse ich die foreach-Schleife weg, und übergebe die shopid einzeln, klappt es. Merkt er sich irgendwie $1 vom letzen Match? Was muss ich ändern, das es klappt?
Mit freundlichen Grüßen
Jens Puruckherr
Hi,
da $1 offenbar den Wert des zuletzt gefundenen Matches behält - auch in foreach - muss ich wohl anders vorgehen:
foreach my $shopid(1..5){ my $pattern = "<Katalog Shopid="$shopid">.*?</Katalog>"; print "Suche: $pattern \n"; $xml =~ /($pattern)/ ? print "$1 \n" : print "nix gefunden\n" }
Und siehe da: Freude
Mit freundlichen Grüßen
Jens Puruckherr
On Thu, Feb 26, 2004 at 09:58:08AM +0100, Jens Puruckherr wrote:
#!/usr/bin/perl
use strict; use warnings; my $xml = "<Katalog Shopid="1">1,2,3,4,5</Katalog><Katalog Shopid="2">7,8,9,10</Katalog>";
Hallo Jens,
ich würde XML nicht selber parsen. Wie verhält sich dein Script, wenn UTF-8 oder UTF-16 als Zeichensatz verwendet wird? Außerdem könnten Zeichen mittels Entities codiert sein. Vorschlag: Ein Script, das einen SAX-Parser verwendet.
Gruß, Thomas
Hallo Thomas,
ich würde XML nicht selber parsen. Wie verhält sich dein Script, wenn UTF-8 oder UTF-16 als Zeichensatz verwendet wird? Außerdem könnten Zeichen mittels Entities codiert sein. Vorschlag: Ein Script, das einen SAX-Parser verwendet.
Es wird UTF-8 verwendet. Prinzipiell hast du auch recht, aber: Da die XMLs nur intern ausgetauscht werden, weiss ich ziemlich genau, was da generiert wird. Dazu kommt, dass alle XMLs vorher gegen ein detailliertes Schema validiert werden. Somit kann ich ziemlich sicher sein, was ich hier bearbeite. Meine anfängliche Begeisterung für einen Parser wich dann schnell der Erkenntis, das für viele Aufgaben der Parser einfach oversized ist. Konkret betreibe ich hier XML-Preprocessing. Verschiedene XMLs müssen nach bestimmten Kriterien gesplittet oder ergänzt werden. Schneller als mit Perl-Regex ist das wirklich nicht zu machen.
Die Applikation selber ist OO und das Bearbeiten der XMLS wird in zahlreichen Methoden vorgenommen. Dann immer den Parser und die XML-Bäume mit zu übergeben .... hmm ... keine Lust ;-) So übergebe ich 2 Strings und die werden schrittweise zurecht-ge-reg-ext. Funktioniert eigentlich prima und recht fix. So sieht es momentan im Live-Betrieb aus:
forach my $shop (1..5) { ... my $all; if( $newartikel =~ /(<Katalog .*>.*</Katalog>)/s ){# mehrzeilig $all = $1; # merken }else{ next; }
my $pattern = "<Katalog Shopid="$shop">.*?</Katalog>"; # ? -> nicht so gierig if($newartikel =~ /($pattern)/){ my $hit = $1; $newartikel =~ s/$all/$hit/; # gesamten Katalogbereich durch Shopspez. ersetzen }else{ next; } .... }
Einfacher bekomme ich es mit einem XML-Parser auch nicht hin.
Was anderes: ich suche noch einen Erfahrungsaustausch mit jemanden der sich mit SOAP::Lite ein wenig auskennt. Ich kenne nur die soaplite-Gruppe auf yahoo. Da bin ich aber rausgeflogen, weil unsere Firmenmailserver komische Dinge macht....
Mit freundlichen Grüßen
Jens Puruckherr
lug-dd@mailman.schlittermann.de