Komplexes XML mit XML::Simple parsen

V

volleimer

Hallo,

ich habe folgendes XML:

Code:
<termine>
	<januar>
		<kurs id="0" lastwnode="false">
			<datum>10.01.2005</datum>
			<datum_kurz>Mo 10.</datum_kurz>
			<name>test1</name>
			<farbe>mag_text10</farbe>
		</kurs>
		<kurs id="1" lastwnode="false">
			<datum>11.01.2005</datum>
			<datum_kurz>Di 11.</datum_kurz>
			<name>test2</name>
			<farbe>mag_text10</farbe>
		</kurs>
	</januar>
	<februar>
		<kurs id="0" lastwnode="true">
			<datum>10.02.2005</datum>
			<datum_kurz>Mo 10.</datum_kurz>
			<name>test1</name>
			<farbe>mag_text10</farbe>
		</kurs>
		<kurs id="1" lastwnode="false">
			<datum>11.02.2005</datum>
			<datum_kurz>Di 11.</datum_kurz>
			<name>test2</name>
			<farbe>mag_text10</farbe>
		</kurs>
	</februar>
	<maerz>
		<kurs id="0" lastwnode="false">
			<datum>10.03.2005</datum>
			<datum_kurz>Mo 10.</datum_kurz>
			<name>test1</name>
			<farbe>mag_text10</farbe>
		</kurs>
	</maerz>
</termine>

Aus disem XML möchte ich eine Liste der Felder "datum" zu jeweils den Select-Feldern "test1" und "test2" anhängen.

die Select-Felder sollen aus o. XML so aussehen:

test1
- 10.01.2005
- 10.02.2005
- 10.03.2005

test2
- 11.01.2005
- 11.02.2005

Ich habe jetzt schon das mittels der Funktion Dumper ausgeben lassen. Jedoch komme ich nicht damit klar die Strukur auseinander zu pfriemeln und dann eine Liste für test1 und test2 zu erstellen.
Könnt ihr mir evtl. behilflich sein?

Gruß,
Uwe
 
V

volleimer

Hier ist meine Ausgabe des Data::Dumper:

Code:
$VAR1 = {
          'Schneiden 1' => {
                             'datum_kurz' => 'Mo 10.',
                             'farbe' => 'mag_text10',
                             'datum' => '10.01.2005',
                             'id' => '0',
                             'lastwnode' => 'false'
                           },
          'Schneiden 2' => {
                             'datum_kurz' => 'Mo 10.',
                             'farbe' => 'mag_text10',
                             'datum' => '11.01.2005',
                             'id' => '1',
                             'lastwnode' => 'false'
                           }
        };

Wie bekomme ich jetzt die Felder "datum" in jeweils ein seperate SelectBox Schneiden1 und 2?
Kann mir denn wirklich keiner helfen?
 

renee

Erfahrenes Mitglied
Du solltest wissen, was Du willst. Einmal hört es sich so an, als soll das Datum sowohl in die Select-Test1 als auch Select-Test2... Dann aber zeigen Deine Beispiele komplett unterschiedliche Daten!

Wenn alle Daten in beide Select sollen, dann könntest Du es so machen:

Code:
my (@test1, @test2);

foreach my $key($hashref){ # $hashref ist die Hashreferenz von XML::Simple
  push(@test1,$hashref->{$key}->{datum});
  push(@test2,$hashref->{$key}->{datum});
}

foreach(\@test1,\@test2){
  print "<select>";
  print "<option>$_</option>\n" for(@$_);
}

Generell würde ich Dir raten zur HTML-Ausgabe das Modul HTML::Template zu benutzen. Eine Doku habe ich hier: http://perl.renee-baecker.de/HTML_Template.pdf