PHP XML Objekte als Variablen zusammenfassen

Skhoney

SMS-Change.de
ID: 67036
L
2 Mai 2006
624
22
Moin Moin,

ich bin gerade dabei ein einfaches Templatesystem zu versuchen, aber irgendwie bekomme ich es nicht hin die Variablen zusammen zufügen.

Ich habe Template-Variabeln die quasi die Struktur zur XML enthalten. Mein Problem ist, dass ich diese nicht so zusammenfassen kann, das ich diese auch ausgeben kann.

$XML->Details->ProductTitle = Mein Titel

Beispiel:
PHP:
$Template['titel'] = '->Details->ProductTitle';
echo $XML{$GetTemplate['template_titel']};

Gibt aber nicht "Mein Titel" aus.

Ich weiß nicht ob ich genau vermittel kann, was ich ausgeben möchte... Ich hoffe ihr könnt mir helfen. 8O:-?
 
Die eingeschleusten Zeichen im RegExp sind nicht escapt. Mit dem richtigen Trennzeichen gehts schon schief, was da erzählt wird :p

Auf was will ich hinaus? Ich hab früher mein Templatesystem selber geschrieben. Aber ne fertige Lösung, die bewährt is(!) - Smarty :yes: - is halt unkomplizierter und kann schon alles, was man sich im Laufe der Zeit mit einer eigenen Lösung erst erarbeiten muss. In Smarty sind schon x Jahre Entwicklung und Tests und Bugfixes von Tausenden und Abertausenden von Leuten drin, die es benutzen.

edit:
Ok, ich nehm den ersten Absatz zurück. Im Kommentar is vermerkt, dass man aufpassen muss, um es nicht schiefgehen zu lassen. Nicht besonders hübsch...
 
OKey danke schon mal für die Hilfe, aber ich meine damit nicht direkt ein Template System das HTML und Code trennt, sondern eins mit dem ich verschiedenen XML Dateien für mein System standartiseiren kann.

Ich habe ein System für das ich verschiedene Werte brauche, jede XML ist anders aufgebaut und damit heißen auch die Objekte immer anders. Ich möchte die Werte vorgeben und in einer DB abspeichern, damit ich wenn die XML verarbeitet werden soll, die richtigen Daten zugeordnet werden können.

Beispiel XML 1
PHP:
<XML>
  <titel>XML 1</titel>
  <datensatz>
    <id>1</id>
    <desc>Bla bla Blub</desc>
  <datensatz>

Beispiel 2
PHP:
<XML>
  <titel>XML 2</titel>
  <datensatz>
    <id>
          <id>2</desc>
          <desc>Bla bla Blub</desc>
    </id>
  <datensatz>

Die Knotenpunkte sind also bei den Dateien unterschiedlich wenn ich zum Beispiel an desc will, einmal $xml->datensatz->desc und eimal $xml->datensatz->id->desc und ich möchte jetzt diese unterschiedlichen Paths als Text in eine Template-DB schreiben und dann auslesen um diese entsprechend immer passend auszulesen.

Ich würde jetzt "datensatz->desc" und einmal "datensatz->id->desc" speichern um für mein System immer den passenden Knoten für desc (mit $template['desc']) auslesen zu können.

Meine Frag ist jetzt: Wie füge ich diese zusammen, das ich mit simple_xml diese knoten so wieder auslesen kann. $simple_xml->{$template['desc']} oder wie auch immer geht ja nicht. Geht das überhaupt das ich mir die Variable so zusammen bauen kann?
 
was halt richtig geil wäre, eine Funktion die aus dem normalen xml einen eindimensionalen array macht:
"$xml->datensatz->id->desc" wird dann zum Beispiel zu "$xml_array['datensatz_id_desc']"

Gibt es sowas?
 
was halt richtig geil wäre, eine Funktion die aus dem normalen xml einen eindimensionalen array macht:
"$xml->datensatz->id->desc" wird dann zum Beispiel zu "$xml_array['datensatz_id_desc']"

Gibt es sowas?

Ich frage mich gerade, was dir das nützen würde, falls du nicht schon vorher alle Ebenen und Bezeichnungen kennst. Und selbst dann musst du daraus ja wieder Ebenen machen, falls ich das richtig verstanden habe.

Also, an deiner Stelle würde ich die einzelnen Elemente per implode() zu einem String machen, den dann speichern, im Bedarfsfall auslesen und per explode() in ein auswertbares Array holen, mit dem du dann per foreach() wieder die Ebenen zusammenstellen kannst.
 
Der korrekte Ansatz um das Problem der Daten aus dem XML auszulesen wäre hier vermutlich eine eigene Klasse, der Du im Konstruktor die XML-Datei oder das XML als String übergibst. Intern wird das XML dann geparset und gespeichert, während Du eine Methode bereitstellt, die Dir die Inhalte zu einem übergebenen Pfad ausliefert. Damit hättest Du alles schön gekapselt und wärest ausreichend flexibel. Und Du würdest Dir so seltsame Konstrukte wie in Zeile Deines Beispielcodes im ersten Post sparen... ;)

Ungetester Pseudo-Ansatz ohne jegliche Art der Fehlerbehandlung:
PHP:
<?php
class XMLTemplate
{
    protected $data;

    public function __construct($xml)
    {
        $this->data = simplexml_load_string($xml);
    }

    public function get($path)
    {
        // Ermöglicht sowohl '->foo->bar' als auch ['foo', 'bar'] oder ['->foo', 'bar->baz'] als Parameter
        $separator = '->';
        $temp = implode($separator, func_get_args());
        $path = explode($separator, $temp);
        $path = array_filter($path);

        $value = $this->data;
        while ($node = array_shift($path)) {
             $value = $value->$node;
        }
        return $value;
    }
}

$xml = new XMLTemplate($deinXML);
$value = $xml->get('->foo->bar->baz');

Letztendlich liesse sich das Problem auch durch das Verwenden von XPath lösen, aber ich vermute, das würde hier den Rahmen sprengen.

Das Problem an Deinem gewählten Ansatz ist, dass Du versuchst, das Durchhangeln an Eigenschaften von einem Objekt durch einen simplen String abzubilden. So funktioniert PHP nicht. Du könntest da mit eval() tricksen, aber das ist weder schön noch sinnvoll. Sowas baut man nur für schnelle Hacks oder zum Debuggen.