PDA

Bekijk Volledige Versie : Hoe haal ik gegevens op met XML?



Nico Schuyt
27/06/07, 11:43
Er word verwacht dat ik met XML gegevens ophaal van een andere server.
Frustrerend is dat wordt voorgedaan dat dat heel eenvoudig is 'PHP kan toch
XML babbelen?', maar dat niemand een voorbeeld script heeft en ik ook geen,
voor mij begrijpelijke, informatie vind via Google.
Onderstaande aanpak werkt op een unix-server (Widexs), niet op een andere
unix-server (nxs) en al helemaal niet op een windows-server.

Heeft iemand een verwijzing naar een eenvoudig artikel met wat voorbeeld
scripts?

Bij voorbaat dank,
Nico Schuyt

-----------------
Dit werkt dus soms:

# openen van socketverbinding naar hetextranet
$fp = fsockopen("ssl://interdata.vwe.nl", 999, $errno, $errstr, 30);
# indien het maken van de socketverbinding mislukt is echo dan de
foutmelding
if (!$fp) {
echo "Fout $errstr ($errno)<br />\n";
exit;
} else {
# anders stel het xml requestbericht samen
# xml request
$vwepassword="xxxxxx";
//$XMLBody =
"XMLBody=<bericht><authenticatie><naam>cartal</naam><wachtwoord>".$vwepassword."</wachtwoord><referentie>mijnref</referentie><berichtsoort>CARTAL</berichtsoort></authenticatie><parameters><kenteken>$strKenteken</kenteken></parameters></bericht>";
$XMLBody =
"XMLBody=<bericht><authenticatie><naam>cartal</naam><wachtwoord>".$vwepassword."</wachtwoord><referentie></referentie><berichtsoort>CARTAL</berichtsoort></authenticatie><parameters><kenteken>$strKenteken</kenteken></parameters></bericht>";
# maken van headers
$headers = "";
$headers .= "POST /DataAanvraag.asmx/DataRequest HTTP/1.1\n";
$headers .= "Host: interdata.vwe.nl:999\n";
$headers .= "Content-Type: application/x-www-form-urlencoded\n";
$headers .= "Content-Length: ".strlen($XMLBody)."\n";
$headers .= "\n";

# sturen van headers en xml request naar hetextranet
fputs($fp, "$headers"."$XMLBody");

# instellen van timeout waarde voor socketverbinding
socket_set_timeout($fp, 1);

# ophalen van xml response
$XMLResponse = "";

while (false !== ($char = fgetc($fp))) {
$XMLResponse .= "$char";
}

# filteren van antwoord gegevens uit xml response
$strKenteken = getValue("kenteken",$XMLResponse);
$strMerk = getValue("merk",$XMLResponse);
$strModeltype = getValue("modeltype",$XMLResponse);
$strKleur = getValue("kleur",$XMLResponse);
$strDatumdeel1 = getValue("datumdeel1",$XMLResponse);
$strMotorcode = getValue("motorcode",$XMLResponse);
$strBrandstof = getValue("brandstof",$XMLResponse);
$strTransmissie = getValue("transmissie",$XMLResponse);

fclose($fp);
} //Van !$fp

Michiel de Roo
28/06/07, 01:19
Nico Schuyt wrote:
> Er word verwacht dat ik met XML gegevens ophaal van een andere server.
> Frustrerend is dat wordt voorgedaan dat dat heel eenvoudig is 'PHP kan toch
> XML babbelen?', maar dat niemand een voorbeeld script heeft en ik ook geen,
> voor mij begrijpelijke, informatie vind via Google.
> Onderstaande aanpak werkt op een unix-server (Widexs), niet op een andere
> unix-server (nxs) en al helemaal niet op een windows-server.
>
> Heeft iemand een verwijzing naar een eenvoudig artikel met wat voorbeeld
> scripts?
>
> Bij voorbaat dank,
> Nico Schuyt
>
> -----------------
> Dit werkt dus soms:
>
> # openen van socketverbinding naar hetextranet
> $fp = fsockopen("ssl://interdata.vwe.nl", 999, $errno, $errstr, 30);

misschien is openssl niet geinstalleerd.

http://nl3.php.net/manual/en/ref.openssl.php

Nico Schuyt
28/06/07, 01:19
Michiel de Roo wrote:
> Nico Schuyt wrote:
>> Er word verwacht dat ik met XML gegevens ophaal van een andere
>> server. Frustrerend is dat wordt voorgedaan dat dat heel eenvoudig
>> is 'PHP kan toch XML babbelen?', maar dat niemand een voorbeeld
>> script heeft en ik ook geen, voor mij begrijpelijke, informatie vind
>> via Google.
>> Onderstaande aanpak werkt op een unix-server (Widexs), niet op een
>> andere unix-server (nxs) en al helemaal niet op een windows-server.
>>
>> Heeft iemand een verwijzing naar een eenvoudig artikel met wat
>> voorbeeld scripts?

>> -----------------
>> Dit werkt dus soms:
>> # openen van socketverbinding naar hetextranet
>> $fp = fsockopen("ssl://interdata.vwe.nl", 999, $errno, $errstr, 30);

> misschien is openssl niet geinstalleerd.
> http://nl3.php.net/manual/en/ref.openssl.php

Bedankt voor de tip Michiel! Ik zal dat navragen.

Het (b)lijkt ook te kunnen met
cURL: http://nl3.php.net/curl
of
xml-rpc: http://www.xmlrpc.com/
maar hoe ik zoiets toepas op een XML-berichtje als uit mijn voorbeeld gaat
mij (ver) boven de pet :-(

--
Nico

Ronald Klip
28/06/07, 01:19
Op Wed, 27 Jun 2007 20:36:15 +0200 schreef Nico Schuyt:

> Michiel de Roo wrote:
>
>> misschien is openssl niet geinstalleerd.
>> http://nl3.php.net/manual/en/ref.openssl.php
>
> Bedankt voor de tip Michiel! Ik zal dat navragen.

phpinfo() is je vriend. Er zou iets moeten staan als
OpenSSL support enabled
OpenSSL Version OpenSSL [versie datum]



--
groet, Ronald

Nico Schuyt
28/06/07, 11:36
Ronald Klip wrote:
> Nico Schuyt:
>> Michiel de Roo wrote:

>>> misschien is openssl niet geinstalleerd.
>>> http://nl3.php.net/manual/en/ref.openssl.php

>> Bedankt voor de tip Michiel! Ik zal dat navragen.

> phpinfo() is je vriend. Er zou iets moeten staan als
> OpenSSL support enabled
> OpenSSL Version OpenSSL [versie datum]

Maar natuurlijk! > Op beide unix-servers enabled.

Het probleem treedt op bij uitlezen van de response:
# sturen van headers en xml request naar hetextranet
fputs($fp, "$headers"."$XMLBody");
# instellen van timeout waarde voor socketverbinding
socket_set_timeout($fp, 1);
# ophalen van xml response
$XMLResponse = "";

while (false !== ($char = fgetc($fp))) {
$XMLResponse .= "$char";
}

Die laatste lus werkt (op server van NXS) netjes alle tekens (1154) uit de
response af en blijft dan hangen.
Geen loop en geen output maar gewoon hangen (als ik een.break toepas na 1155
loops komt er *nooit* een response)
Op server van Widexs treedt dat probleem niet op (beide zijn unix).

Kan zo'n response door de server beeindigd worden met een speciaal teken?
iets als end-of-file in en tekstbestand?

--
Nico

Ronald Klip
29/06/07, 01:35
Op Thu, 28 Jun 2007 08:42:11 +0200 schreef Nico Schuyt:

> while (false !== ($char = fgetc($fp))) {
> $XMLResponse .= "$char";
> }
>
> Die laatste lus werkt (op server van NXS) netjes alle tekens (1154) uit
> de
> response af en blijft dan hangen.
> Geen loop en geen output maar gewoon hangen (als ik een.break toepas na
> 1155
> loops komt er *nooit* een response)
> Op server van Widexs treedt dat probleem niet op (beide zijn unix).

Komisch... Probeer eens een variant:

while (!feof($fp)) {
$XMLResponse .= fread($fp, 512);
}


--
groet, Ronald