SimpleXml Class

Hallo,

ich arbeite gerade an einem kleinem Modul das ein Post Request an eine API sendet und eine XML Datei als Ergebnis zurück bekommt.

Alles klappt soweit wunderbar bis auf das XML parsen. Die Funktion sieht wie folgt aus:

$url = 'api.url';

$oxid = $oUser->oxuser__oxid;

$parameters = array(
  'vorname' => "$oUser->oxuser__oxfname",
  'nachname' => "$oUser->oxuser__oxlname",
  'strasse' => "$oUser->oxuser__oxstreet",
  'hausnr' => "$oUser->oxuser__oxstreetnr",
  'ort' => "$oUser->oxuser__oxcity",
  'plz' => "$oUser->oxuser__oxzip"
  );

$parameter_string = http_build_query($parameters);

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
 curl_setopt($ch, CURLOPT_POSTFIELDS, $parameter_string);
 $result = curl_exec($ch); 

 $xml = new SimpleXMLElement($result);
 $value= $xml->Pfad1->Pfad2->Pfad3->Pfad4->pfad5;
 //an dieser stelle schreibe ich dann die $value in die DB.

 curl_close($ch);

Das alles funktioniert bis auf das parsen der XML-Datei.

Mit $xml = new SimpleXMLElement($result); klappt es nur außerhalb von Oxid, denn Oxid meckert gleich das er die Klasse SimpleXMLElement nicht kennt.

Soweit so gut, also habe ich mir gedacht dann nutze ich die SimpleXml Klasse von Oxid. Allerdings komme ich damit anscheinend nicht zu recht denn ständig gibt es Fehler. Das Problem ist das ich nicht weiß wie die Klasse richtig nutzen kann.

Meine Versuche bis jetzt:

$xml = new(OxidEsales\Eshop\Core\SimpleXml::xmlToObject($result));
$xml = new OxidEsales\Eshop\Core\SimpleXml::xmlToObject($result);
$xml = oxNew(OxidEsales\Eshop\Core\SimpleXml::xmlToObject($result));

Wo ist mein Denkfehler bzw. was mache ich falsch?

Hallo @gajel :slight_smile:

  1. Prüfen ob SimpleXml PHP Extension aktiviert

  1. Wie wäre es z.B. damit nach Beispielen im vorhandenen Code suchen wie OXID eShop Klasse SimpleXml aufgerufen wird?

Wie wäre es mit

$simpleXml = oxNew(\OxidEsales\Eshop\Core\SimpleXml::class);
$oXml = $simpleXml->xmlToObject($sXml);

Aber wahrscheinlich meinst

$sXml = $simpleXml->objectToXml($oInput, $sDocument);

um eine XML Ausgabe zu erhalten. Dazu musst immer auf das erwartete Datenformat achten, dass ein Objekt übergibst.

Zusätzlich gibt https://www.php.net/curl_exec nur ein true oder false zurück. Da gibt es den CURL Parameter CURLOPT_RETURNTRANSFER dann bekommst Ergebnis zurück.

1 Like

Ähm. Die Klasse simplexml (-4.10x oxsimplexml) ist doch integriert.

Hallo @indianer3c.

SimpleXml ist aktiviert. Ich hatte den Request (die ganz curl Funktion ist etwas komplexer) erstmal Oxid unabhängig gebaut und getestet. PHP Datei in den root Folder vom dev.shop und da ging es eben ganz normal mit $xml = new SimpleXMLElement($result);.

Daher dachte ich, ich kann das Ganze in eine Funktion packen, die nötige Klasse erweitern und als Modul verpacken. Aber da hat mir eben das XML parsen ein Strich die Rechnung gemacht.

Bin kein Profi und versuche immer alles nach und nach in der Oxid-Welt zu verstehen. Manchmal eben mit mehr Erfolg und manchmal mit weniger :wink:

$simpleXml = oxNew(\OxidEsales\Eshop\Core\SimpleXml::class);
$oXml = $simpleXml->xmlToObject($sXml);

Funktioniert auf den ersten Blick bestens. Daher vielen Dank dir :slight_smile:

1 Like

Hey gajel,

innerhalb des Frameworks hast du vermutlich unter einem Namespace gearbeitet. Um dort die nativen Klassen nutzen zu können, musst du in dem Fall explizit sagen, dass du nicht den aktuellen Namespace, sondern den obersten, also den von PHP nutzen möchtest.
Der Aufruf wäre also wie folgt:

$xml = new \SimpleXMLElement($result);
4 Likes

Vielen Dank an alle Beteiligten, besonders an @indianer3c und @Ramster :slight_smile:

3 Likes