Probleme beim XML File auslesen

  • Themenstarter Themenstarter besi
  • Beginndatum Beginndatum
B

besi

Hallo,

Ich habe ein XML-File welches so aussieht:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
	<gesmes:subject>Reference rates</gesmes:subject>
	<gesmes:Sender>
		<gesmes:name>European Central Bank</gesmes:name>
	</gesmes:Sender>
	<Cube>
		<Cube time='2005-05-10'>
			<Cube currency='USD' rate='1.2854'/>
			<Cube currency='JPY' rate='135.86'/>
			<Cube currency='CYP' rate='0.5791'/>
			.....
		</Cube>
	</Cube>
</gesmes:Envelope>

Ich habe jetzt ein Script geschrieben, welches dieses XML-File auslesen kann:

PHP:
  if(!$xml = implode(" ", file($url)))
	 return 0; // Das File kann nicht eingelesen werden

  $p = xml_parser_create();
  xml_parse_into_struct($p, $xml, $vals, $index);
  xml_parser_free($p);

  // print_r($vals); 

  for($x=13 ; $vals[$x][attributes][RATE] ; $x+=3){
    $rate =  $vals[$x][attributes][RATE];
	$curr =  $vals[$x][attributes][CURRENCY];
	$currarr[$curr] = $rate;
  }

  return $currarr;

Wenn ich das ganze aber vom localhost auf einen Server umziehe funktioniert das nicht mehr. Ich habe folgenden Code verwendet. Das ganze ist leider ein "gebastel" ich denke man sollte das irgendwie besser lösen können. Ich habe es einfach so hingeflickt bis es funktioniert hat.

Mein Wunsch wäre folgendes:
$currency = $xml[Cube][0][Cube][JPY].... // oder etwas in der Art

Oder wie kann ich es am besten bewerkstelligen damit es zuverlässig funktioniert?

Besten Dank!
 
Ich denke schon dass es installiert ist. Mit dem Script was ich habe wird aus dem XML-Code folgendes Array:

$vals:
Code:
Array
(
    [0] => Array
        (
            [tag] => GESMES:ENVELOPE
            [type] => open
            [level] => 1
            [attributes] => Array
                (
                    [XMLNS:GESMES] => http://www.gesmes.org/xml/2002-08-01
                    [XMLNS] => http://www.ecb.int/vocabulary/2002-08-01/eurofxref
                )

            [value] => 
 	
        )

    [1] => Array
        (
            [tag] => GESMES:SUBJECT
            [type] => complete
            [level] => 2
            [value] => Reference rates
        )

    [2] => Array
        (
            [tag] => GESMES:ENVELOPE
            [value] => 
 	
            [type] => cdata
            [level] => 1
        )

    [3] => Array
        (
            [tag] => GESMES:SENDER
            [type] => open
            [level] => 2
            [value] => 
 		
        )

    [4] => Array
        (
            [tag] => GESMES:NAME
            [type] => complete
            [level] => 3
            [value] => European Central Bank
        )

    [5] => Array
        (
            [tag] => GESMES:SENDER
            [value] => 
 	
            [type] => cdata
            [level] => 2
        )

    [6] => Array
        (
            [tag] => GESMES:SENDER
            [type] => close
            [level] => 2
        )

    [7] => Array
        (
            [tag] => GESMES:ENVELOPE
            [value] => 
 	
            [type] => cdata
            [level] => 1
        )

    [8] => Array
        (
            [tag] => CUBE
            [type] => open
            [level] => 2
            [value] => 
 		
        )

    [9] => Array
        (
            [tag] => CUBE
            [type] => open
            [level] => 3
            [attributes] => Array
                (
                    [TIME] => 2005-05-11
                )

            [value] => 
 			
        )

    [10] => Array
        (
            [tag] => CUBE
            [type] => complete
            [level] => 4
            [attributes] => Array
                (
                    [CURRENCY] => USD
                    [RATE] => 1.2882
                )

        )

    [11] => Array
        (
            [tag] => CUBE
            [value] => 
 			
            [type] => cdata
            [level] => 3
        )

    [12] => Array
        (
            [tag] => CUBE
            [type] => complete
            [level] => 4
            [attributes] => Array
                (
                    [CURRENCY] => JPY
                    [RATE] => 135.70
                )

        )

    [13] => Array
        (
            [tag] => CUBE
            [value] => 
            
 			[type] => cdata
            [level] => 3
        )

    [14] => Array
        (
            [tag] => CUBE
            [type] => complete
            [level] => 4
            [attributes] => Array
                (
                    [CURRENCY] => CYP
                    [RATE] => 0.5784
                )

        )

    [15] => Array
        (
            [tag] => CUBE
            [value] => 
 			
            [type] => cdata
            [level] => 3
        )

    [16] => Array
        (
            [tag] => CUBE
            [type] => complete
            [level] => 4
            [attributes] => Array
                (
                    [CURRENCY] => CZK
                    [RATE] => 30.050
                )

        )

    [17] => Array
        (
            [tag] => CUBE
            [value] => 
 			
            [type] => cdata
            [level] => 3
        )

    [18] => Array
        (
            [tag] => CUBE
            [type] => complete
            [level] => 4
            [attributes] => Array
                (
                    [CURRENCY] => DKK
                    [RATE] => 7.4433
       ......

Und das ist auch nicht gerade übersichtlich. Ich habe dann festgestellt dass bei 10 der erste, für mich relevante, Eintrag beginnt. Der nächste bei 12, 14 usw. Als ich dann das Script umgezogen habe begann das ganze bei 13 und machte 3er Schritte.

Mit welcher Systematik soll ich nun mein File auslesen, damit solche Diskrepanzen nicht mehr auftauchen?
 
Zuletzt bearbeitet von einem Moderator:
besi hat gesagt.:
Mein Wunsch wäre folgendes:
$currency = $xml[Cube][0][Cube][JPY].... // oder etwas in der Art
Soo einfach wirds wohl nicht gehen, aber das "Gebastel" kannst Du etwas eleganter haben:
PHP:
  $p = xml_parser_create();
  xml_parse_into_struct($p, $xml, $vals, $index);
  xml_parser_free($p);

  foreach($vals AS $key){
    $rate =  $key['attributes']['RATE'];
    $curr =  $key['attributes']['CURRENCY'];
    $currarr[$curr] = $rate;
  }
  $currarr = array_slice($currarr, 1);
mit array_slice($currarr, 1) entfernst Du das erste, leere Element, das von den Attributen XMLNS:GESMES und XMLNS erzeugt wird.
 
Zurück