xml aus binärdatei extrahieren

xml aus binärdatei extrahieren

am 07.03.2006 19:23:11 von Gerhard Wolf

Hallo,

ich möchte aus einer Datei den enthaltenen XML-Code extrahieren.
Der ganze Rest vorallem vor dem XML ist Binärer Programmcode. Aber
auch zwischen den Start bzw.End-Tags steht Prog.code.

Meine Idee war die Datei komplett (ca. 3MB) einlesen und mit einer
Substitution das XML extrahieren:

open(IN,$infile) or die $!;
binmode(IN);
my $file = ;

geht aber nicht - es werden nur ein paar Zeilen eingelesen.

wie macht man sowas?

Re: xml aus binärdatei extrahieren

am 07.03.2006 20:50:56 von Wolf Behrenhoff

Gerhard Wolf schrieb:
> Hallo,
>
> Meine Idee war die Datei komplett (ca. 3MB) einlesen und mit einer
> Substitution das XML extrahieren:
>
> open(IN,$infile) or die $!;
> binmode(IN);
> my $file = ;
>
> geht aber nicht - es werden nur ein paar Zeilen eingelesen.

Natürlich! Denn Perl liest nur bis zum Input-Record-Separator, egal wie
du binmode einstellst. Um die ganze Datei einzulesen (slurp), solltest
du daher $/ auf undef setzen.

Also zum Beispiel
open...
binmode...
my $file = do { local $/; };

Wolf

Re: xml aus binärdatei extrahieren

am 07.03.2006 20:58:16 von joerg.hubele

Gerhard Wolf wrote:
> Meine Idee war die Datei komplett (ca. 3MB) einlesen und mit einer
> Substitution das XML extrahieren:
>
> open(IN,$infile) or die $!;
> binmode(IN);
> my $file = ;
>
> geht aber nicht - es werden nur ein paar Zeilen eingelesen.
So liest du nur bis zum ersten auftreten von $/ ein. Siehe $/ in perlvar.

local $/; # enable "slurp" mode
local $_ = ; # whole file now here

Jörg

Re: xml aus binärdateiextrahieren

am 07.03.2006 21:18:45 von Christian Garbs

Mahlzeit!

Gerhard Wolf wrote:

> open(IN,$infile) or die $!;
> binmode(IN);
> my $file = ;
>
> geht aber nicht - es werden nur ein paar Zeilen eingelesen.

Um genau zu sein: eine Zeile :-)

Wenn Du das Zeilenendezeichen abstellst, dann landet alles in der
einen Zeile:

open(IN,$infile) or die $!;
binmode(IN);
local $/; # enable "slurp" mode
my $file = ;

Siehe auch `perldoc perlvar`.

Gruß,
Christian
--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
..'E002020001C2222221400005CA2A2A27C02001C2222221C20003E0402 02201F2422221C00'
..'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..); ;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:',y;:;\t;;print;_;_