foreach Schleife selektiv auswerten?

Ich möchte gerne eine XML aus einer Datei auslesen und mir dort Teile des XML Codes ausgeben lassen.

Der XML Code sind von der Struktur her so aus:


<?xml version="1.0" encoding="UTF-8" ?>
<ircodes>
  <device id="Device1">
    <key id="Command1" code="00230177008F000E039E0000000000032213121412132411101115001908"/>
    <key id="Command2" code="0077003B0AEB000000000000000000034101211119811921192139212921192139212921191B001908"/>
    <key id="Command2" code="0078003A0AE8000000000000000000034101211119811921291139212951392129211913001908"/>
  </device>
  <device id="Device2">
    <key id="An" code="003701E6035400B3110700F0000000260001013214711411642134114431142115013610001908"/>
    <key id="Aus" code="003801E5035400B2110200F0002600010132147114116421342134312411151E10001908"/>
    <key id="1" code="003801E5035500B200000026000101321471141164111421142124112411241110001908"/>
    <key id="2" code="003701E5035500B30000002600010132147114118421142114212411241110001908"/>
    <key id="3" code="003701EA034D00B3000000260001013214711411642124214421242110001908"/>
    <key id="4" code="003701E5035400B3110600F0000000260001013214711411641134312431341115013610001908"/>
    <key id="5" code="003801E7035000B0110600F3000000260001013214711411A4311441341115013610001908"/>
    <key id="6" code="003701E7035200B3110900F1000000260001013214711411643114215411242115013610001908"/>
    <key id="7" code="003701E8035200B3110A00F000000026000101321471141164111411143124111411341115013610001908"/>
    <key id="8" code="003701E7035200B4110900F10000002600010132147114118411143114211411341115013610001908"/>
    <key id="9" code="003701EB035100B2110A00F0000000260001013214711411642114314411342115013610001908"/>
  </device>
  <device id="Device3">
    <key id="Systempower" code="003801F8033E00B610F0000000260001013211141144111411144124113441143134151C10001908"/>
    <key id="Standby" code="003801F5033F00BC10F228EC00260001013211141144111411144114114431144134151C161C161C10001908"/>
  </device> 
</ircodes>

Jetzt möchte ich von jedem Gerät den Namen des Befehls (id) sowie den Code (code) auslesen.

Probiert habe ich es mit:


$xmlFile =  IPS_GetKernelDir().'webfront/user/import/ir.xml';

if (file_exists($xmlFile)) {
    $xml = simplexml_load_file($xmlFile);

    foreach ( $xml->device as $device )
        {

           echo '<br>Gerät: ' . $device['id'] . '<br>';


				foreach ($xml->device->key as $key)
				{

				echo 'Befehl Name: ' . $key['id'] . '<br>';
				echo 'Code: ' . $key['code'] . '<br>';
				}




        }

} else {
    exit("Datei $xmlFile kann nicht geöffnet werden.");
}


Mein Problem ist das er mir mit dem Code die Geräte auslistet aber immer nur die Codes des ersten Geräts ausgibt. Wo habe ich in dem Script einen Fehler bzw. was muss ich ändern, damit ich den Code für jedes Gerät aufgelistet bekomme?

Mein zweites Problem ist das selektive Auslesen von XML.

Hier wieder ein Beispiel für den XML Code:


<?xml version="1.0" encoding="UTF-8" ?>
<devices listversion="1.2">
	<locations>
 		<location id="Room1">
			<device id="IRDevice1" type="CODE" data="Device_IR_1" address="IR:01" gateway="Gateway_Typ" gatewaytype="gateway"/>
			<device id="IRDevice2" type="CODE" data="Device_IR_2" address="IR:01" gateway="Gateway_Typ" gatewaytype="gateway"/>
			<device id="LED_Remote" data="switch" gateway="Gateway_Typ" type="LEDS" address="ABC" sensor="off" gatewaytype="gateway"/>
			<device id="LEDIIController" data="" gateway="Gateway_Typ" type="L2" address="123456" sensor="off" isBranch="false" gatewaytype="gateway"/>
		</location>
		<location id="Room2">
			<device id="FS20Device" data="switch" gateway="Gateway_Typ" type="FS20" address="B4.4E.02" gatewaytype="gateway"/>
			<device id="ITDevice" data="switch" gateway="Gateway_Typ" type="IT" address="1.0" gatewaytype="gateway"/>
		</location>
	</locations>
</devices>

Die Einträge unterscheiden sich vom type der kann z.B. CODE, FS20 usw. sein. Ich würde gerne die Liste auslesen und nur Elemente mit z.B. type CODE ausgeben lassen.

Probiert habe ich es mit if geht aber nicht:


$xmlFile =  IPS_GetKernelDir().'webfront/user/import/devices.xml';

if (file_exists($xmlFile))
 {
    $xml = simplexml_load_file($xmlFile);

    foreach ( $xml->locations->location as $location )
        {
			
			 echo "Raum: " . $location["id"] . '<br>';

          foreach ($xml->locations->location->device as $device)
				{
				$type = $device["type"];
				//if ($type == "CODE")
				//	{
				
					echo "Gerät: " . $device["id"] . '<br>';
	         	echo "Data: " . $device["data"] . '<br>';
	         	echo "Gateway: " . $device["gateway"] . '<br>';
	         	echo "Typ: " . $device["type"] . '<br>';
	         	echo "Adresse: " . $device["address"] . '<br><br>';
				//	}
				
				}

        }

       
} else {
    exit("Datei $xmlFile kann nicht geöffnet werden.");
}

Hat jemand einen Tipp wie ich den Code gestalten muss um nur Einträge von z.B. type CODE angezeigt zu bekommen?

Zu 1.
In der zweiten foreach Schleife musst du dann $device als Quelle nutzen anstatt $xml.

Zu 2.
Dafür gibt es xpath. Ist aber nicht so einfach zu erklären. Am besten Google befragen. Gibt es gutes Tutorial bei W3Schools.

Michael

Hi!

Hier mal ein Beispiel mit xPath, verwende ich zum Beispiel in meinem Modul „BundesligaTabelle DFB“, da kannst du auch abschauen:

<?
$string = '<?xml version="1.0" encoding="UTF-8" ?>
<ircodes>
  <device id="Device1">
    <key id="Command1" code="00230177008F000E039E0000000000032213121412132411101115001908"/>
    <key id="Command2" code="0077003B0AEB000000000000000000034101211119811921192139212921192139212921191B001908"/>
    <key id="Command2" code="0078003A0AE8000000000000000000034101211119811921291139212951392129211913001908"/>
  </device>
  <device id="Device2">
    <key id="An" code="003701E6035400B3110700F0000000260001013214711411642134114431142115013610001908"/>
    <key id="Aus" code="003801E5035400B2110200F0002600010132147114116421342134312411151E10001908"/>
    <key id="1" code="003801E5035500B200000026000101321471141164111421142124112411241110001908"/>
    <key id="2" code="003701E5035500B30000002600010132147114118421142114212411241110001908"/>
    <key id="3" code="003701EA034D00B3000000260001013214711411642124214421242110001908"/>
    <key id="4" code="003701E5035400B3110600F0000000260001013214711411641134312431341115013610001908"/>
    <key id="5" code="003801E7035000B0110600F3000000260001013214711411A4311441341115013610001908"/>
    <key id="6" code="003701E7035200B3110900F1000000260001013214711411643114215411242115013610001908"/>
    <key id="7" code="003701E8035200B3110A00F000000026000101321471141164111411143124111411341115013610001908"/>
    <key id="8" code="003701E7035200B4110900F10000002600010132147114118411143114211411341115013610001908"/>
    <key id="9" code="003701EB035100B2110A00F0000000260001013214711411642114314411342115013610001908"/>
  </device>
  <device id="Device3">
    <key id="Systempower" code="003801F8033E00B610F0000000260001013211141144111411144124113441143134151C10001908"/>
    <key id="Standby" code="003801F5033F00BC10F228EC00260001013211141144111411144114114431144134151C161C161C10001908"/>
  </device>
</ircodes>';


$xml = new SimpleXMLElement($string);

$result1 = $xml->xpath('.//device');
print_r($result1);
?>

Grüße,
Chris

Mit foreach dann so in etwa (stimmt nicht ganz g):

<?
$string = '<?xml version="1.0" encoding="UTF-8" ?>
<ircodes>
  <device id="Device1">
    <key id="Command1" code="00230177008F000E039E0000000000032213121412132411101115001908"/>
    <key id="Command2" code="0077003B0AEB000000000000000000034101211119811921192139212921192139212921191B001908"/>
    <key id="Command2" code="0078003A0AE8000000000000000000034101211119811921291139212951392129211913001908"/>
  </device>
  <device id="Device2">
    <key id="An" code="003701E6035400B3110700F0000000260001013214711411642134114431142115013610001908"/>
    <key id="Aus" code="003801E5035400B2110200F0002600010132147114116421342134312411151E10001908"/>
    <key id="1" code="003801E5035500B200000026000101321471141164111421142124112411241110001908"/>
    <key id="2" code="003701E5035500B30000002600010132147114118421142114212411241110001908"/>
    <key id="3" code="003701EA034D00B3000000260001013214711411642124214421242110001908"/>
    <key id="4" code="003701E5035400B3110600F0000000260001013214711411641134312431341115013610001908"/>
    <key id="5" code="003801E7035000B0110600F3000000260001013214711411A4311441341115013610001908"/>
    <key id="6" code="003701E7035200B3110900F1000000260001013214711411643114215411242115013610001908"/>
    <key id="7" code="003701E8035200B3110A00F000000026000101321471141164111411143124111411341115013610001908"/>
    <key id="8" code="003701E7035200B4110900F10000002600010132147114118411143114211411341115013610001908"/>
    <key id="9" code="003701EB035100B2110A00F0000000260001013214711411642114314411342115013610001908"/>
  </device>
  <device id="Device3">
    <key id="Systempower" code="003801F8033E00B610F0000000260001013211141144111411144124113441143134151C10001908"/>
    <key id="Standby" code="003801F5033F00BC10F228EC00260001013211141144111411144114114431144134151C161C161C10001908"/>
  </device>
</ircodes>';


$xml = new SimpleXMLElement($string);

//$result1 = $xml->xpath('.//device');
//print_r($result1);


foreach($xml->xpath('.//device/key/@code') as $key)
{
	print_r($key['code']);
}

?>

-Chris-

Super, Du bist mein Held. Manchmal sieht man die simpelsten Dinge nicht.:o

Danke schaue ich mir an.