Jeg skal lese en XML-fil fra start til slutt og skrive ut dataene på et
annet format. Rekkefølgen på innholdet har betydning.
Konkret skal jeg gjøre følgende:
Gitt XML-fila
<?xml version="1.0" encoding="iso-8859-1"?>
<kurs tittel="Kurstittel">
<kapittel nr="01" tittel="Kapittel 1">
<tekst>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</tekst>
<tekst> Duis ultricies. Phasellus augue sapien, auctor ac.</tekst>
</kapittel>
<<kapittel nr="02" tittel="Kapittel 2">
<tekst>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</tekst>
</kapittel>
</kurs>
så skal følgende skje:
- opprette katalogen Kurstittel
- opprette katalogen Kurstittel/01
- opprette fila Kurstittel/01/tekst1 med innhold "Lorem ipsum dolor sit
amet, consectetuer adipiscing elit."
- opprette fila Kurstittel/01/tekst2 med innhold "Phasellus augue sapien,
auctor ac."
- opprette katalogen Kurstittel/02
- opprette fila Kurstittel/02/tekst1 med innhold "Lorem ipsum dolor sit
amet, consectetuer adipiscing elit."
All hjelp for å få til dette setter jeg enormt pris på.
--
jhk
> Jeg er på jakt etter eksempler på bruk av XML::LibXML i Perl.
Vel, jeg foretrekker XML::Simple så jeg gir et eksempel på det i
stedet...
> Jeg skal lese en XML-fil fra start til slutt og skrive ut dataene på et
> annet format. Rekkefølgen på innholdet har betydning.
>
> Konkret skal jeg gjøre følgende:
>
> Gitt XML-fila
>
> <?xml version="1.0" encoding="iso-8859-1"?>
> <kurs tittel="Kurstittel">
> <kapittel nr="01" tittel="Kapittel 1">
> <tekst>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</tekst>
> <tekst> Duis ultricies. Phasellus augue sapien, auctor ac.</tekst>
> </kapittel>
> <<kapittel nr="02" tittel="Kapittel 2">
> <tekst>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</tekst>
> </kapittel>
> </kurs>
#!/usr/bin/perl
use XML::Simple;
use Data::Dumper;
my $x = XMLin("/tmp/fila");
print Dumper($x);
gir deg noe slikt:
$VAR1 = {
'kapittel' => [
{
'tekst' => [
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.',
' Duis ultricies. Phasellus augue sapien, auctor ac.'
],
'tittel' => 'Kapittel 1',
'nr' => '01'
},
{
'tekst' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.',
'tittel' => 'Kapittel 2',
'nr' => '02'
}
],
'tittel' => 'Kurstittel'
};
Burde være overkommelig å komme seg videre derfra.
Bjørn
--
You know, a mentally retarded man ain't got nothing in the world these days.
> Vel, jeg foretrekker XML::Simple så jeg gir et eksempel på det i
> stedet...
Vil denne modulen beholde rekkefølgen på nodene?
--
jhk
Jeg svarer meg selv fordi jeg gjorde en enkel test.
Samme XML-fil som før, men med en ekstra node mellom to <tekst>-noder.
<?xml version="1.0" encoding="iso-8859-1"?>
<kurs tittel="Kurstittel">
<kapittel nr="01" tittel="Kapittel 1">
<tekst>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</tekst>
<kulepunkt>Det kule punktet</kulepunkt>
<tekst> Duis ultricies. Phasellus augue sapien, auctor ac.</tekst>
</kapittel><kapittel nr="02" tittel="Kapittel 2">
<tekst>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</tekst>
</kapittel>
</kurs>
Output fra eksempelet ditt blei da:
$VAR1 = {
'kapittel' => [
{
'kulepunkt' => 'Det kule punktet',
'tekst' => [
'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.',
' Duis ultricies. Phasellus augue sapien, auctor ac.'
],
'tittel' => 'Kapittel 1',
'nr' => '01'
},
{
'tekst' => 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.',
'tittel' => 'Kapittel 2',
'nr' => '02'
}
],
'tittel' => 'Kurstittel'
};
Begge tekst-nodene grupperes i en array og kulepunkt legges i en scalar for seg.
Derfor passer dessverre ikke XML::Simple for meg. :-(
Tilbake til start.
--
jhk
Jeg leste ikke meldingen før nå, så dette er kanskje ikke lenger
aktuelt, men jeg tar sjansjen.
Her er en løsning som bruker XML::LibXML.
#!/usr/bin/perl -w
use XML::LibXML;
use strict;
# Hent filnavn fra kommandolinje
my $filename = $ARGV[0] or
die "Usage: $0 <filename>";
# Opprett XML-parser
my $parser = XML::LibXML->new() or
die "Can't create XML::LibXML parser.";
# Les XML-dokument og parse til DOM-objekt
my $dom = $parser->parse_file($filename) or
die "Couldn't parse file '$filename': $!";
# Hent ut kurs-tittel
my $courseTitle = $dom->findvalue('/kurs/@tittel') or
die "No root element 'kurs' with attribute 'tittel'.";
# Opprett kurs-katalog
print "Creating directory '$courseTitle'.\n";
mkdir $courseTitle or
die "Can't create directory '$courseTitle': $!";
# Finn og prosessér alle kapitler
for my $chNode ($dom->findnodes('/kurs/kapittel')) {
my $chNum = $chNode->findvalue('@nr');
# Opprett kapittel-katalog
my $chDir = "$courseTitle/$chNum";
print "Creating directory '$chDir'.\n";
mkdir $chDir or
die "Can't create directory '$chDir': $!";
# Finn og prosessér alle tekster i kapittelet
my $txCount = 1;
for my $txNode ($chNode->findnodes('tekst')) {
# Opprett tekstfil
my $txFile = "$chDir/tekst" . $txCount++;
print "Writing file '$txFile'.\n";
open TEXT, ">$txFile" or
die "Can't write to file '$txFile': $!";
print TEXT $txNode->textContent;
close TEXT;
}
}
--
Lars Haugseth