php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.12.2011, 21:54  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard [Erledigt] stdClass Object mit SimpleXML/xpath bearbeiten

Moin,

Kann mir einer verraten, wie ich fix mal ein stdClass Object mit SimpleXML/xpath bearbeiten kann?

Der Grund ist, daß ich über eine externe Schnittstelle ein stdClass Object zurück bekomme (worauf ich leider keinen Einfluss habe) und die Ergebnismenge nicht immer einen identischen Aufbau hat (in Bezug auf die Ebenentiefe).
Der Aufbau sieht i.d.R. so aus:
Code:
stdClass Object
(
    [functionNameReturn] => stdClass Object
        (
            [status] => 200
            [statusText] => 
            [data] => stdClass Object
                (
                    [empty] => 
                    [array] => stdClass Object
                        (
                            [array] => stdClass Object
                                (
                                    [parentNodeId] => 0815
                                    [hasChilds] => 
                                    [assemblyGroupName] => GroupName
                                    [assemblyGroupNodeId] => GroupId
                                )

                        )

                )

        )

)
nur die Ebenen können leider in Tiefe variieren, daher wäre mir SimpleXML/xpath halt lieb.
Mir fällt leider nur grad nicht ein, wie ich das bewerkstellige, denn simplexml_load_file() und simplexml_load_string() fallen dafür ja aus.

Wär nett, wenn jemand einen Tipp für mich hat.
Danke!
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.12.2011, 22:14  
meikel
Gast
 
Beiträge: n/a
Standard

Tip 1: http://www.php.net/manual/de/simplex....construct.php
Tip 2: http://de.wikipedia.org/wiki/Rekursion
  Mit Zitat antworten
Alt 27.12.2011, 23:22  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Darf man fragen, was das für eine externe Schnittstelle ist und wie Du diese ansprichst?

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 28.12.2011, 08:35  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

@meikel: Danke für die Links. Leider sehe ich darin keine Lösung für meine Frage. SimpleXMLElement kann ich m.E. auch kein stdClass Object übergeben.
Und Iteration ist mir natürlich ein Begriff und bspw. foreach auf solch ein Objekt wie angegeben anzuwenden, würde auch funktionieren, aber wie gesagt, sind die Rückgabe-Objekte in der Ebenen-Tiefe veränderlich, so daß ich gerne einen direkten Zugriff auf ChildNodes bspw. per xpath hätte.

@Jens: Es handelt sich um die Rückgabe-Objekte der TecDoc-Schnittstelle. Diese wird über SOAP/WSDL angesprochen. Das Ergebnis einer Abfrage siehst Du oben. Lediglich die Werte sind von mir verändert worden. Der Aufbau ist so, wie die Schnittstelle es zurückgibt.

Ich komme an die Daten, die ich haben will soweit ja auch mit eigener Iteration ran, allerdings finde ich das zu umständlich und denke, daß es evtl. unzuverlässig wäre, da ja der Aufbau der Rückgaben verschiedene Tiefen hat.

Daher würde ich gerne etwas wie xpath nutzen. Ob nun mit SimpleXML, DOM oder etwas anderem, was ich evtl. nicht bedenke, wäre mir gleich. Hauptsache ich kann über Expressions direkt auf ChildNodes zugreifen.

Danke
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 28.12.2011, 09:03  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Arne Drews Beitrag anzeigen
@meikel: Danke für die Links. Leider sehe ich darin keine Lösung für meine Frage.
Ein bißchen genauer lesen:
http://www.php.net/manual/de/simplexmlelement.xpath.php
sowie auch das:
http://www.php.net/manual/de/class.simplexmlelement.php
Zitat:
SimpleXMLElement kann ich m.E. auch kein stdClass Object übergeben.
Wat willste denn nu parsen: ein Objekt oder ein XML String?

Und wäre das von vornherein ausgeschlossen?
PHP-Code:
class arneAXL extends SimpleXMLElement{
  public function 
__construct(){
     
$p holwas();
     
parent::__construct($p, ... );

  }

Zitat:
Und Iteration ist mir natürlich ein Begriff und bspw. foreach auf solch ein Objekt wie angegeben anzuwenden, würde auch funktionieren, aber wie gesagt, sind die Rückgabe-Objekte in der Ebenen-Tiefe veränderlich, so daß ich gerne einen direkten Zugriff auf ChildNodes bspw. per xpath hätte.
Alles da, Arne:
http://www.php.net/manual/de/simplex...t.children.php

Ich weiß zwar nicht, was Du genau vorhast, aber es liest sich so, als wolltest Du Dir selbst ein Bein stellen.
  Mit Zitat antworten
Alt 28.12.2011, 10:26  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Zitat:
Zitat von Arne Drews Beitrag anzeigen
@Jens: Es handelt sich um die Rückgabe-Objekte der TecDoc-Schnittstelle. Diese wird über SOAP/WSDL angesprochen. Das Ergebnis einer Abfrage siehst Du oben. Lediglich die Werte sind von mir verändert worden. Der Aufbau ist so, wie die Schnittstelle es zurückgibt.
Sowas hab ich vermutet. Meinst Du nicht, dass sich das Problem mittels Class-Mapping einfacher lösen ließe?

Irgendwie kommt es mir ein wenig so vor, als ob Du nur wegen eines ungünstigen Grundansatzes auf der Suche nach einer Lösung für Dein aktuelles Problem bist

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 28.12.2011, 11:05  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von meikel
Ich weiß zwar nicht, was Du genau vorhast, aber es liest sich so, als wolltest Du Dir selbst ein Bein stellen.
...das kann durchaus sein! Ich sehe aber leider nicht, wie mir Deine Links weiterhelfen sollen.
Klar habe ich bereits vor diesem Thread mit SimpleXML gearbeitet und kenne die Doku, aber ich habe noch nirgendwo gefunden, wie ich evtl. ein stdClass Object damit behandeln kann, sofern das überhaupt möglich ist?

Was ich vorhabe ist relativ einfach gesagt: Ich möchte die ChildNodes eines wie oben angegebenen stdClass Objektes direkt ansprechen/filtern.
Wenn ich mit SimpleXML total auf dem Holzweg bin (was auch sein kann), bin ich auch gern empfänglich für Alternativen.

Zitat:
Zitat von Jens Clasen
Meinst Du nicht, dass sich das Problem mittels Class-Mapping einfacher lösen ließe?
Möglich... Allerdings habe ich damit bisher keine Erfahrung. Habe grad mal gegoogled, aber bekomme immer Links zu ORMs, was für diesen einen Fall m.E. too much wäre, oder?

Aber danke für Eure Hinweise!
Wenn ich falsch liege, bitte hauts mir um die Ohren...
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 28.12.2011, 11:24  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Du kannst in den Optionen zu SoapClient angeben, welche Klassen für die Objekte mit den Daten verwendet werden sollen. Das kannst Du Dir zu nutze machen, um die Daten im Zuge des Eingangs gleich in die von Dir benötigte Form zu kriegen.

Das grundsätzliche Prinzip zeigt dieser WIKI-Artikel ganz brauchbar. Ich kenn jetzt die Datenstrukturen zu TecDoc nicht, aber wenn ich mich mal am Beispiel aus dem Wiki orientiere, dann könnte man sowas hier machen:

PHP-Code:
<?php
$wsdl         
'http://www.thomas-bayer.com/axis2/services/BLZService?wsdl';
$bankleitzahl '12070000'// testdaten

class RequestType
{
    public 
$blz
}

class 
BankResponseType
{
  private 
$dta;

  public function 
__set($key,$value) { 
    
$this->dta[$key]=$value
    
// hier kannst Du dann z.B. auf $value->bezeichnung zugreifen und 
    // genau den einen Datensatz an einen Handler weiter reichen, der ihn für 
    // Dein Problem passend verarbeitet oder aufbereitet.
    // Nur mal so als _extrem_ ungünstiges Beispiel:
    
if(!in_array($value->bezeichnung,$GLOBALS['banken']))
      
$GLOBALS['banken'][]=$value->bezeichnung;
  }    
  public function 
__get($key) { 
    return 
$this->dta[$key]; 
  }    
}

$banken=array();

$options = array();
$options['classmap']['getBankType']  = 'RequestType';
$options['classmap']['getBankResponseType'] = 'BankResponseType';

$bank         = new RequestType;
$bank->blz    $bankleitzahl;

$soapclient = new SoapClient($wsdl,$options);
$result     $soapclient->getBank($bank);

var_dump($banken);
Im Regelfall betreibt man Soap-Calls ja kaum ohne wie auch immer gearteten Cache (und sei es im Arbeitsspeicher für den Zeitraum des Skriptdurchlaufs). Warum also nicht die Daten in einer Form in den Cache schreiben, der genau den notwendigen Inhalt der Daten in der passenden Form wiederspiegelt?

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 28.12.2011, 12:05  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Danke Jens!
Das sieht aus, als wenn es mein Problem löst. Ich bekomme bisher zwar immer noch nicht das, was ich möchte, aber ich teste mal weiter und melde mich sonst wieder.

Danke!



EDIT
Im Prinzip ist das nichts anderes, als das was ich momentan mache, nur daß das automatisch beim Response-Empfang passiert.
Z.Zt. habe ich eine Fetch()-Methode in meiner APIClass, die den Response aufwertet.
Die Variante über die Option classmap vom SOAPClient macht dies nur automatisiert, was mir den erhofften Vorteil nicht wirklich einbringt.
Aber ich finde die Variante cleverer und setz das trotzdem so um.
Danke für den Hinweis und das Beispiel!
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein

Geändert von Arne Drews (28.12.2011 um 20:15 Uhr).
Arne Drews ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Soap response stdclass Object ausgeben Agrippa PHP Einsteiger 2 18.12.2011 01:52
[Erledigt] PDF im Browser Streamen PiXeL1337 PHP Einsteiger 22 08.09.2011 16:24
Mysqli - Object Array wird mehrfach erzeugt Phil7789 PHP Einsteiger 19 11.05.2011 18:37
Gruppenmitglieder zählen choice Datenbanken 2 07.12.2010 19:58
Object of class stdClass could not be converted to string Katinator PHP Einsteiger 11 03.12.2010 13:12
Bestimmte Array-Elemente löschen ArcticMonkey PHP Einsteiger 5 28.11.2010 14:56
xpath Ergebnisse in File speichern BOSSE123 PHP Tipps 2010 12 11.11.2010 09:50
Cannot use object of type stdClass marc77 PHP Tipps 2010 2 05.02.2010 15:37
[Erledigt] Object + Array + Object ausgeben Roflkid PHP-Fortgeschrittene 3 17.05.2009 17:28
Persistence Framework #Avedo Software-Design 37 28.03.2009 17:32
[Erledigt] xlm in php-Variablen ch.bielmeier PHP Tipps 2008 6 19.12.2008 14:13
[Erledigt] stdClassObjekt nach String durchsuchen TAZweb PHP Tipps 2008 6 21.07.2008 08:38
Gibt keine Ausgabe aus socke PHP Tipps 2005-2 9 31.08.2005 15:39
update auf php 5.0.4 robo47 Server, Hosting und Workstations 6 10.04.2005 19:00

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
tecdoc wsdl, assemblygroupnodeid, php element in stdclass object ändern, object(stdclass) to xml, php object mit \-\, php class_tecdoc, php object xpath, php soap convert stdclass to xml, stdclass object zu xml php5, wsdl soap php tutorial tecdoc, tecdoc wsdl rückgabewerte, tecdoc php [array] => array, simplexmlelement stdclass, xpath soap xml, simplexml_load_string xpath mehere ebenen, tecdoc wdsl, php simplexml_load_file xpath write, soapclient stdobject in xml, php soap axis2 classmap, php stdclass to object mapping

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:41 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum