XML simplexml_load_file to Array mit speziellen Key

djnelly

Erfahrenes Mitglied
Hallo Community,

ich habe eine Problem zu einer Übersetzungsmatrix vorliegen.

Gegeben ist folgendes XML-Dokument:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyIPSLanguage>
   <LanguageInfo>
       <Bereich>Bereich</Bereich>
       <DE>DE</DE>
       <ENG>ENG</ENG>
       <Bemerkungen>Bemerkungen</Bemerkungen>
   </LanguageInfo>
   <LanguageItem>
       <Bereich>Global</Bereich>
       <DE>Passwort</DE>
       <ENG>password</ENG>
       <Bemerkungen>test1</Bemerkungen>
   </LanguageItem>
   <LanguageItem>
       <Bereich>Zuschnitt</Bereich>
       <DE>Fehler beim Anlegen</DE>
       <ENG>Error when creating</ENG>
       <Bemerkungen/>
   </LanguageItem>
</MyIPSLanguage>

Diesen Code lese ist wie folgt ein. Ziel ist es, ein Array zu erhalten.
Code:
<?php
$xml = simplexml_load_file("test.xml");
$json = json_encode($xml);
$array = json_decode($json,TRUE);
#print_r($array);
?>
Ergebnis wie folgt:
Code:
SimpleXMLElement Object
(
    [LanguageInfo] => SimpleXMLElement Object
        (
            [Bereich] => Bereich
            [DE] => DE
            [ENG] => ENG
            [Bemerkungen] => Bemerkungen
        )
    [LanguageItem] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [Bereich] => Global
                    [DE] => Passwort
                    [ENG] => password
                    [Bemerkungen] => test1
                )
            [1] => SimpleXMLElement Object
                (
                    [Bereich] => Zuschnitt
                    [DE] => Fehler beim Anlegen
                    [ENG] => Error when creating
                    [Bemerkungen] => SimpleXMLElement Object
                        (
                        )
                )
        )
)

Mein Problem besteht darin, dass die Variable "DE" auch gleichzeitig "key" eines Elements sein soll. Ich könnte dies natürlich durch einen Schleifendurchlauf umbauen, aber frage micht, ob es eine bessere Lösung gibt.

Vielen Dank!
 
Zuletzt bearbeitet:
Eigentlich sieht der Array genau so aus, wie ich das vom XML erwarten würde.
Ich versteeh nicht, was anders sein soll.

Wie soll der Array aussehen?

Anbei, was bewirkst du mit
Array/Objekt Konstrukt -> Json
json -> Array/Objekt Konstrukt

Diesen Zwischenschritt kannst du dir sparen
 
Ja, das derzeitge Ergebnis ist so, wie man es erwarten würde.
Ich bräuchte es wie folgt. Das "value" DE soll gleichzeitig der Name vom "key" sein.

Code:
SimpleXMLElement Object
(
    [LanguageInfo] => SimpleXMLElement Object
        (
            [Bereich] => Bereich
            [DE] => DE
            [ENG] => ENG
            [Bemerkungen] => Bemerkungen
        )
    [LanguageItem] => Array
        (
            [Passwort] => SimpleXMLElement Object
                (
                    [Bereich] => Global
                    [DE] => Passwort
                    [ENG] => password
                    [Bemerkungen] => test1
                )
            [Fehler beim Anlegen] => SimpleXMLElement Object
                (
                    [Bereich] => Zuschnitt
                    [DE] => Fehler beim Anlegen 
                    [ENG] => Error when creating
                    [Bemerkungen] => SimpleXMLElement Object
                        (
                        )
                )
        )
)
 
PHP:
foreach($xml->LanguageItem as $id => $item){
    $xml->LanguageItem[$item->DE] = $item;
    unset($xml->LanguageItem[$id]);
}

Mein Test
PHP:
<pre><?php
$xml = (object) array(
    'LanguageInfo' => (object) array(
        'Bereich' => 'Bereich',
        'DE' => 'DE',
        'ENG' => 'ENG',
        'Bemerkungen' => 'Bemerkungen'
    ),
    'LanguageItem' => array(
         (object) array(
            'Bereich' => 'Global',
            'DE' => 'Passwort',
            'ENG' => 'password',
            'Bemerkungen' => 'test1',
        ),
        (object) array(
            'Bereich' => 'Zuschnitt',
            'DE' => 'Fehler beim Anlegen',
            'ENG' => 'Error when creating',
            'Bemerkungen' => 'test'
        )
    )
);
foreach($xml->LanguageItem as $id => $item){
    $xml->LanguageItem[$item->DE] = $item;
    unset($xml->LanguageItem[$id]);
}
print_r ($xml);

?></pre>
Ausgabe
Code:
stdClass Object
(
   [LanguageInfo] => stdClass Object
       (
           [Bereich] => Bereich
           [DE] => DE
           [ENG] => ENG
           [Bemerkungen] => Bemerkungen
       )
   [LanguageItem] => Array
       (
           [Passwort] => stdClass Object
               (
                   [Bereich] => Global
                   [DE] => Passwort
                   [ENG] => password
                   [Bemerkungen] => test1
               )
           [Fehler beim Anlegen] => stdClass Object
               (
                   [Bereich] => Zuschnitt
                   [DE] => Fehler beim Anlegen
                   [ENG] => Error when creating
                   [Bemerkungen] => test
               )
       )
)
 
Sorry, aber ich verstehe das nicht 100%ig.
Woher kommt dein Beispiel $xml ?

Ich lese die Daten vorher per simplexml_load_file ein.
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyIPSLanguage>
   <LanguageInfo>
       <Bereich>Bereich</Bereich>
       <DE>DE</DE>
       <ENG>ENG</ENG>
       <Bemerkungen>Bemerkungen</Bemerkungen>
   </LanguageInfo>
   <LanguageItem>
       <Bereich>Global</Bereich>
       <DE>Passwort</DE>
       <ENG>password</ENG>
       <Bemerkungen>test1</Bemerkungen>
   </LanguageItem>
   <LanguageItem>
       <Bereich>Zuschnitt</Bereich>
       <DE>Fehler beim Anlegen</DE>
       <ENG>Error when creating</ENG>
       <Bemerkungen/>
   </LanguageItem>
</MyIPSLanguage>

Code:
<?php
$xml = simplexml_load_file("test.xml");
foreach($xml->LanguageItem as $id => $item){
    $xml->LanguageItem[$item->DE] = $item;
    unset($xml->LanguageItem[$id]);
}
print_r($xml);
?>

ergibt bei mir nicht das gleiche Ergebnis, sondern zerstört die Form.
 
$xml ist ein Test von mir, da ich dein XML nicht habe. $xml basiert auf dem print_r() von dir nach dem Jsongedöns.

Zeig doch mal dein Resultat direkt nach simplexml_load_file() und auch das, welches die Form (was immer du mit Form meinst) verloren hat.
 
Hier die XML-Vorgabe:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyIPSLanguage>
   <LanguageInfo>
       <Bereich>Bereich</Bereich>
       <DE>DE</DE>
       <ENG>ENG</ENG>
       <Bemerkungen>Bemerkungen</Bemerkungen>
   </LanguageInfo>
   <LanguageItem>
       <Bereich>Global</Bereich>
       <DE>Passwort</DE>
       <ENG>password</ENG>
       <Bemerkungen>test1</Bemerkungen>
   </LanguageItem>
   <LanguageItem>
       <Bereich>Zuschnitt</Bereich>
       <DE>Fehler beim Anlegen</DE>
       <ENG>Error when creating</ENG>
       <Bemerkungen/>
   </LanguageItem>
</MyIPSLanguage>

nach:
PHP:
$xml = simplexml_load_file("test.xml");
$json = json_encode($xml);
$array = json_decode($json,TRUE);

erhalte ich:

Code:
Array
(
    [LanguageInfo] => Array
        (
            [Bereich] => Bereich
            [Key] => Key
            [DE] => DE
            [ENG] => ENG
            [Bemerkungen] => Bemerkungen
        )
    [LanguageItem] => Array
        (
            [0] => Array
                (
                    [Bereich] => Global
                    [DE] => Passwort
                    [ENG] => password
                    [Bemerkungen] => test1
                )
            [1] => Array
                (
                    [Bereich] => Global
                    [DE] => Flammkaschierung
                    [ENG] => flame lamination
                    [Bemerkungen] => test2
                )
            [2] => Array
                (
                    [Bereich] => Warenschau
                    [DE] => Die Rolle konnte nicht hinzugefügt werden!
                    [ENG] => The role could not be added!
                    [Bemerkungen] => Array
                        (
                        )
                )
            [3] => Array
                (
                    [Bereich] => Zuschnitt
                    [DE] => Fehler beim Anlegen der Zuschnitt-Folge!
                    [ENG] => Error when creating the cut sequence!
                    [Bemerkungen] => Array
                        (
                        )
                )
        )
)

jetzt würde deine foreach-Schleife kommen:

PHP:
foreach($array->LanguageItem as $id => $item){
    $array->LanguageItem[$item->DE] = $item;
    unset($array->LanguageItem[$id]);
}

und die Ausgabe:

Code:
Array
(
    [LanguageInfo] => Array
        (
            [Bereich] => Bereich
            [Key] => Key
            [DE] => DE
            [ENG] => ENG
            [Bemerkungen] => Bemerkungen
        )
    [LanguageItem] => Array
        (
            [0] => Array
                (
                    [Bereich] => Global
                    [DE] => Passwort
                    [ENG] => password
                    [Bemerkungen] => test1
                )
            [1] => Array
                (
                    [Bereich] => Global
                    [DE] => Flammkaschierung
                    [ENG] => flame lamination
                    [Bemerkungen] => test2
                )
            [2] => Array
                (
                    [Bereich] => Warenschau
                    [DE] => Die Rolle konnte nicht hinzugefügt werden!
                    [ENG] => The role could not be added!
                    [Bemerkungen] => Array
                        (
                        )
                )
            [3] => Array
                (
                    [Bereich] => Zuschnitt
                    [DE] => Fehler beim Anlegen der Zuschnitt-Folge!
                    [ENG] => Error when creating the cut sequence!
                    [Bemerkungen] => Array
                        (
                        )
                )
        )
)
 
OK, mein Fehler. Das blöde XML-Objekt verhält sich wirklich störrisch. Und mit dem json-gedönst entfernst wandelst du alles in Arrays um. Hab das im ersten Posting nicht so ganz gesehen.
Na dann geht es so:
PHP:
$xml = simplexml_load_file("test.xml");
$json = json_encode($xml);
$arr = json_decode($json, TRUE);
foreach($arr['LanguageItem'] as $id => $item){
    $arr['LanguageItem'][$item['DE']] = $item;
    unset($arr['LanguageItem'][$id]);
}
 
Super, Danke dir!

Noch eine Frage bitte. In meinen ersten Post hatte ich geschrieben, dass die ja mit einer Schleife lösbar wäre. Wie steht es da mit der Performance, wenn es viele tausende Datensätze in der XML-Vorlage gibt? Ich hatte gehofft, man könnte dies vielleicht über Parameter der einzelnen Funktionen direkt umsetzen. Es wäre auch die Möglichkeit da, der XML Attribute je <LanguageItem> mit zu übergeben.
 

Neue Beiträge

Zurück