[PHP] SOAP XML naar array probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • I_stealth_I
  • Registratie: Januari 2001
  • Laatst online: 13-07 22:51

I_stealth_I

Tweak It OR leave it!

Topicstarter
Ik probeer een response van een webservice vanuit een xml naar een array te zetten. Ik krijg wel een xml terug, maar simplexml kan er geen chocolade van maken en zet dus niets om.

Als ik de reponse zelf kopieer en in een variable zet, dan lukt het mij wel om middels simplexml een array aan te maken. Na 1,5 dag zoeken en puzzelen probeer ik het hier. Wellicht ziet iemand hier wat er aan de hand is.

code:
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
31
32
<?php
require("password.php");

error_reporting(E_ALL);
ini_set('display_errors', '1');

$client = new SoapClient("http://lwvweb1.blabla.nl/profitservices/getconnector.asmx?WSDL", array('features' => SOAP_SINGLE_ELEMENT_ARRAYS,'trace' => 1,'exceptions' => 0 ));

$filter = '<Filters>
            <Filter FilterId="Filter 1">
            <Field FieldId="Nummer" OperatorType="10">1010402</Field>
            </Filter>
           </Filters>';

$GetDataParam = array('environmentId'=> "AC2010",'userId'=>$username,'password'=>$password,'logonAs'=>"",'connectorId'=>"klaas",'filtersXml'=>$filter);

$GetDataResponse = $client->GetData($GetDataParam);
$xmlstr = $client->__getLastResponse();

if (is_soap_fault($GetDataResponse))
    {
        trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
    } else
    {
    //"XML;"$GetDataResponse);
    }

echo $xmlstr;

$xml = simplexml_load_string($xmlstr);
print_r($xml);
?>


Een voorbeeld van de XML

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<AfasGetConnector>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="AfasGetConnector">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="klaas">
<xs:complexType>
<xs:sequence
><xs:element name="Nummer" type="xs:string" minOccurs="0"/>
<xs:element name="Soort_basic_contact" type="xs:string" minOccurs="0"/>
<xs:element name="Naam" type="xs:string" minOccurs="0"/></xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<klaas>
<Nummer>1010402</Nummer>
<Soort_basic_contact>Organisatie</Soort_basic_contact>
<Naam>America</Naam>
</klaas></AfasGetConnector>


Eigenlijk gaat om het resultaat vanaf regel 18.

/dev/null


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

Als de xml code rechtstreeks in $xmlstr zetten wel werkt, terwijl bovenstaande stukje code niet werkt dan zal er blijkbaar toch nog een verschil zitten in beide versies van de xml. Probeer eens te kijken of die beide strings daadwerkelijk gelijk zijn. (door bijvoorbeeld de bovenstaande xml in je code te vergelijken met de binnengekregen xml). Het zou bijvoorbeeld best kunnen zijn dat er in de ene wat extra (onzichtbare) tekens staan (zoals een UTF-8 BOM oid)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • I_stealth_I
  • Registratie: Januari 2001
  • Laatst online: 13-07 22:51

I_stealth_I

Tweak It OR leave it!

Topicstarter
Janoz schreef op maandag 02 juli 2012 @ 13:24:
Probeer eens te kijken of die beide strings daadwerkelijk gelijk zijn. (door bijvoorbeeld de bovenstaande xml in je code te vergelijken met de binnengekregen xml). Het zou bijvoorbeeld best kunnen zijn dat er in de ene wat extra (onzichtbare) tekens staan (zoals een UTF-8 BOM oid)
Ok, klinkt aannemelijk. Hoe zou ik dat het beste kunnen vergelijken? Oftewel hoe maak ik evt. onzichtbare tekens zichtbaar?

/dev/null


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

Jij hebt hetgeen je denkt dat het moet zijn. Daarnaast krijg je iets binnen waar hetzelfde in zou moeten staan. Een simpele $xmlstr == $expectedxmlstr is voldoende om in eerste instantie te kijken of ze hetzelfde zijn. Vervolgens kun je wat code implementeren die uitzoekt wat de verschillen zijn tussen beide variabelen. Als je er dan nog niet uit komt schrijf je de waarde van $xmlstr weg naar een bestand en open je die met een editor waarbij je op byte niveau in de file kunt kijken.

Maar eigenlijk spreekt bovenstaande toch redelijk voor zich?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • I_stealth_I
  • Registratie: Januari 2001
  • Laatst online: 13-07 22:51

I_stealth_I

Tweak It OR leave it!

Topicstarter
Ik heb een response weg laten schrijven naar een file en krijg dan deze inhoud

code:
1
2
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetDataResponse xmlns="urn:Afas.Profit.Services"><GetDataResult>&lt;AfasGetConnector&gt;&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;&lt;xs:element name="AfasGetConnector"&gt;&lt;xs:complexType&gt;&lt;xs:choice maxOccurs="unbounded"&gt;&lt;xs:element name="klaas"&gt;&lt;xs:complexType&gt;&lt;xs:sequence&gt;&lt;xs:element name="Nummer" type="xs:string" minOccurs="0"/&gt;&lt;xs:element name="Soort_basic_contact" type="xs:string" minOccurs="0"/&gt;&lt;xs:element name="Naam" type="xs:string" minOccurs="0"/&gt;&lt;/xs:sequence&gt;&lt;/xs:complexType&gt;&lt;/xs:element&gt;&lt;/xs:choice&gt;&lt;/xs:complexType&gt;&lt;/xs:element&gt;&lt;/xs:schema&gt;&lt;klaas&gt;&lt;Nummer&gt;1010402&lt;/Nummer&gt;&lt;Soort_basic_contact&gt;Organisatie&lt;/Soort_basic_contact&gt;&lt;Naam&gt;America-t&lt;/Naam&gt;&lt;/klaas&gt;&lt;/AfasGetConnector&gt;
</GetDataResult></GetDataResponse></soap:Body></soap:Envelope>

Het lijkt dat er wat mis gaat met de encoding?

/dev/null


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17:46

Creepy

Tactical Espionage Splatterer

Dat ligt er maar net aan wat je terug zou moeten krijgen in GetDataResult. Als dat gespecificeerd is als een String met daarin XML dan klopt het wat je nu terug krijgt lijkt me. Maat wat zeggen ze van AFAS zelf hierover? Die hebben aardig goeie support en zouden je ook met dit probleem moeten kunnen helpen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • I_stealth_I
  • Registratie: Januari 2001
  • Laatst online: 13-07 22:51

I_stealth_I

Tweak It OR leave it!

Topicstarter
Het blijkt dat de < & > tekens werden gesloopt. In de browser zag ik dit niet. Dit kwam naar voren toen ik de output naar een file liet wegschrijven.

Ik heb het nu opgelost door een replace actie
code:
1
2
$xmlstr = str_replace('&gt;', '>', $xmlstr);
$xmlstr = str_replace('&lt;', '<', $xmlstr);

/dev/null


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 16:17

Janoz

Moderator Devschuur®

!litemod

Leuke workaround, maar gegarandeerd dat dit nog problemen op gaat leveren. Je kunt nu twee dingen doen:
1. Zorgen dat het response goed aangeleverd wordt door contact op te nemen met de aanbieder
2. Zo laten en straks weer een topic openen waarom alles misgaat omdat je een stukje tekst met een rare ampersand binnen krijgt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1