[Dresden-pm] Vorkommen eines Elementes in einem String zählen

Winfried Scheibe win at winproject.de
Die Aug 9 09:29:09 PDT 2005


>> danke für die Antwort. Leider sind meine Perl-Kenntnisse rudimentär.
>> Daher fehlt mir ein Beispiel, wie ich aus einem String dann die
>> einzelnen Key/Value-Paare erhalten kann.
>
> Probier noch meine Antwort aus. Nebenan in einer Nachbarmail.
>
> Prinzipiell solltest Du, falls das ganze XML ist, irgendein XML-Modul
> hinzunehmen.
>
> XML::Simple für die einfachen, ersten Sachen und wenn's nicht
> mehr reicht, dann XML::LibXML für "richtige" XML-Sachen.

Dem kann ich nur voll zustimmen! Mit Strings oder Regulären Ausdrücken
solltest du bei so einer Aufgabe nicht anfangen. Wenn du schon XML hast,
liest du es am besten auch so strukturiert ein. Ich hänge unten mal ein
einfaches Beispiel von mir an, da kann man hoffentlich einen ersten
Eindruck kriegen wie das so etwa läuft.

>> Zu der Zeile @spiele hätte ich noch ne Frage. Wie kann ich daraus dann
>> einen Eintrag basteln in der Form
>> <div class="ansetzung"><span>Bayern :
>> Rostock</span><span>0:3</span></div>
>>
>> Sollte sicherlich über eine Schleife gehen, die das Array/Hash/Liste
>> @ansetzungen durchsucht und die einzelnen Werte zuweist.

Wie Steffen schreibt, geht auch der Output mit XML::Simple (oder auch wie
im Beispiel unten "traditionell"). Wenn du aber vielleicht sogar nur eine
XML-Datei einlesen und daraus dann HTML machen willst (ohne weitere
Verarbeitungen), könnte auch XSLT etwas für dich sein...

Viele Grüße,
Winfried
---

Beispiel...
Input:
<errors>
	<error>
		<error-key>BS_ERR_PaymentDateAlreadyExpired</error-key>
		<message>The payment date has already been expired</message>
		<tip/>
		<description>The payment date has already been expired</description>
	</error>
	<error>
		<error-key>BS_ERR_InvalidClientID</error-key>
		<message>The given client id is invalid.</message>
		<tip/>
		<description>Thrown if the given client id is invalid.</description>
	</error>
</errors>

Output:
BS_ERR_PaymentDateAlreadyExpired.message=The payment date has already been
expired
BS_ERR_PaymentDateAlreadyExpired.tip=

BS_ERR_InvalidClientID.message=The given client id is invalid.
BS_ERR_InvalidClientID.tip=

Programm was das mit XML::Simple tut:
#!/usr/local/bin/perl -w

#use Data::Dumper;
use XML::Simple;

#$DIR='';
$FILE='./Errors.err.xml';
$OUT='Errors_en.properties';

$xs = new XML::Simple;
$ref = $xs->XMLin($FILE, suppressempty => '');
$errors=$ref->{'error'};

open(OUT,">$OUT");

$i=0;
while (defined($error=$errors->[$i])) {

	print OUT $error->{'error-key'},".message=",
		$error->{'message'},"\n",
		$error->{'error-key'},".tip=",
		$error->{'tip'},"\n\n";
	$i++;
}

close(OUT);
print $i," error messages generated.\n";