Autor Beitrag
kingflo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 37


D6
BeitragVerfasst: Di 31.10.06 11:28 
Hallo...
Ich habe ein Problem, und zwar habe einen Soap Client, der auf einen PHP Soap Service (ohne WSDL) zugreift.

Die PHP funktion getBuddyList liefert mir ein PHP Array zurück und ich weiß leider nicht, wie ich das in delphi jetzt verarbeiten kann.
Wenn ich bei der Funktionsdeklaration als result z.B wideString angebe
ausblenden Delphi-Quelltext
1:
function  getBuddyList(sessionID:string;status:string): WideString; stdcall;					

kommt es folgendermaßen zurück.

Zitat:

<item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:Map"><item><key xsi:type="xsd:string">UserID</key><value xsi:type="xsd:string">10000206</value></item><item><key xsi:type="xsd:string">UserName</key><value xsi:type="xsd:string">fluffy</value></item><item><key xsi:type="xsd:string">firstname</key><value xsi:type="xsd:string">Thomas</value></item><item><key xsi:type="xsd:string">lastname</key><value xsi:type="xsd:string">Memenga</value></item><item><key xsi:type="xsd:string">country</key><value xsi:type="xsd:string">DE</value></item><item><key xsi:type="xsd:string">city</key><value xsi:type="xsd:string">Springe</value></item></item><item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:Map"><item><key xsi:type="xsd:string">UserID</key><value xsi:type="xsd:string">10000201</value></item><item><key xsi:type="xsd:string">UserName</key><value xsi:type="xsd:string">kingflo</value></item><item><key xsi:type="xsd:string">firstname</key><value xsi:type="xsd:string">Florian</value></item><item><key xsi:type="xsd:string">lastname</key><value xsi:type="xsd:string">Gilde</value></item><item><key xsi:type="xsd:string">country</key><value xsi:type="xsd:string">DE</value></item><item><key xsi:type="xsd:string">city</key><value xsi:type="xsd:string">Hamburg</value></item></item><item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:Map"><item><key xsi:type="xsd:string">UserID</key><value xsi:type="xsd:string">10000213</value></item><item><key xsi:type="xsd:string">UserName</key><value xsi:type="xsd:string">mickey</value></item><item><key xsi:type="xsd:string">firstname</key><value xsi:type="xsd:string">Michael</value></item><item><key xsi:type="xsd:string">lastname</key><value xsi:type="xsd:string">Kock</value></item><item><key xsi:type="xsd:string">country</key><value xsi:type="xsd:string">DE</value></item><item><key xsi:type="xsd:string">city</key><value xsi:type="xsd:string">Hamburg</value></item></item><item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:Map"><item><key xsi:type="xsd:string">UserID</key><value xsi:type="xsd:string">10000207</value></item><item><key xsi:type="xsd:string">UserName</key><value xsi:type="xsd:string">Sam75</value></item><item><key xsi:type="xsd:string">firstname</key><value xsi:type="xsd:string">Kock</value></item><item><key xsi:type="xsd:string">lastname</key><value xsi:type="xsd:string">Sandra</value></item><item><key xsi:type="xsd:string">country</key><value xsi:type="xsd:string">DE</value></item><item>

USW.... USW... USW..
.
.
.


so ich hätte es aber ganz gerne auch als array...
und ich habe bei einem WSDL tutorial folgenes gesehen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);
var gsp: GoogleSearchPort;
    result: GoogleSearchResult;
    i: integer;
    rea: ResultElementArray;
begin
  gsp:=GetGoogleSearchPort(true);
  result:=gsp.doGoogleSearch('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', Edit1.Text,
  010, true, 'countryDE', false, 'lang_de''UTF-8''UTF-8');
  if Assigned(result) then begin
    Label1.Caption:=IntToStr(result.estimatedTotalResultsCount)+
    ' Ergebnisse';
    Memo1.Clear;
    rea:=result.resultElements;
    for i:=0 to high(rea) do begin
      Memo1.Lines.Add(rea[i].Title);
      Memo1.Lines.Add(rea[i].URL);
      Memo1.Lines.Add(rea[i].Summary);
      Memo1.Lines.Add('');
    end;
    result.Free;
  end;
end;


dort machen die es mit dem ResultElementArray, aber den typen gibt es ja bei mir nicht... also habe ich mir den Typ in meiner IData.pas erstellt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
  ResultElement        = class;                  { "urn:stryykeSoapServer" }


  ResultElement = class(TRemotable)
  private
    FUserID: WideString;
    FUserName: WideString;
    Ffirstname: WideString;
    Flastname: WideString;
    Fcountry: WideString;
    FOnline: Boolean;
    Fcity: WideString;
  public

  published
    property userid: WideString read FUserID write FUserID;
    property UserName: WideString read FUserName write FUserName;
    property firstname: WideString read Ffirstname write Ffirstname;
    property lastname: WideString read Flastname write Flastname;
    property country: WideString read Fcountry write Fcountry;
    property Online: Boolean read FOnline write FOnline;
    property city: WideString read Fcity write Fcity;

  end;

  ResultElementArray = array of ResultElement;   { "urn:stryykeSoapServer" }


das PHP Array, welches zurück kommt ieht z.B so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
    [0] => Array
        (
            [UserID] => 10000206
            [UserName] => fluffy
            [firstname] => Thomas
            [lastname] => Memenga
            [country] => DE
            [city] => Springe
        )

    [1] => Array
        (
            [UserID] => 10000202
            [UserName] => giri01
            [Online] => 1
            [firstname] => Rajiv
            [lastname] => Giri
            [country] => DE
            [city] => Hamburg
        )

    [2] => Array
        (
            [UserID] => 10000203
            [UserName] => giri02
            [firstname] => Rajiv
            [lastname] => Giri
            [country] => DE
            [city] => Hamburg
        )


jetzt habe ich also bei der functions definition folgenes:

ausblenden Delphi-Quelltext
1:
  function  getBuddyList(sessionID:string;status:string): ResultElementArray; stdcall;					


und mein test aufruf sieht so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
buddys: ResultElementArray;
i:integer;
begin
 buddys:=(SoapConnection1.GetSOAPServer as IDataMod).getBuddyList(sessionID,'all');
     for i:=0 to high(buddys) do begin
      Memo1.Lines.Add(buddys[i].UserName);
    end;

end;


so die anzahl der schleife ist korrekt, und wird auch je nach dem wieviele buddys ich habe ausgeführt... (das ist ja schonma was)
leider ist der UserName irgendwie leer... ('') und ich weiß nicht wieso, bzw was ich jetzt dafür tun kann, damit dass jetzt mal vernünftig funktioniert.