Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

lesing av XML-fil med XML::LibXML

0 views
Skip to first unread message

Jarle H Knudsen

unread,
Aug 8, 2005, 2:21:24 PM8/8/05
to
Jeg er på jakt etter eksempler på bruk av XML::LibXML i Perl.

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

Bjørn Mork

unread,
Aug 8, 2005, 3:09:06 PM8/8/05
to
Jarle H Knudsen <jh...@jarle.com> writes:

> 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.

Jarle H Knudsen

unread,
Aug 8, 2005, 3:48:17 PM8/8/05
to
On Mon, 08 Aug 2005 21:09:06 +0200, Bjørn Mork wrote:

> Vel, jeg foretrekker XML::Simple så jeg gir et eksempel på det i
> stedet...

Vil denne modulen beholde rekkefølgen på nodene?

--
jhk

Jarle H Knudsen

unread,
Aug 8, 2005, 4:09:55 PM8/8/05
to

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

Lars Haugseth

unread,
Aug 18, 2005, 3:35:40 PM8/18/05
to

* Jarle H Knudsen <jh...@jarle.com> wrote:
|
| Jeg er på jakt etter eksempler på bruk av XML::LibXML i Perl.

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

0 new messages