2016-08-10 2 views
1

Ich versuche derzeit, etwas Java-Code in PHP neu zu erstellen. Der Code erstellt XML aus einem bestimmten Objekt und sendet XML-Anforderungen an ein Back-End. Das Backend liefert die Antwort. Jetzt möchte ich die XML-Antwort in einem PHP-Objekt einer bestimmten komplexen Klasse konvertieren. Ich habe SimpleXml verwendet, um die Zeichenfolge in die Klasse XmlResponse zu konvertieren, aber ich kann nur auf den Getter und Setter von der XmlResponse-Klasse und nicht auf die andere Klasse innerhalb der XmlResponse-Klasse zugreifen. In Java verwende ich einfach JAXB, aber ich bin mir nicht sicher, ob so etwas möglich ist. Das Problem ist, dass sich das Daten-Tag von Anfrage zu Anfrage ändern kann und je nach Anfrage andere Objekte liefert!PHP XML String zu komplexen PHP Class

ich das folgende Setup verwenden:

  • PHP 5.6 oder 7

  • Zend 2 oder 3

Grüße!

Am Ende möchte ich etwas wie folgt aus:

<?php 
    $responseObject = convertStringToObject($responseString, XMLResponse::class); 
    $result = $responseObject->getResult(); 
    $data = $responseObject->getResult()->getData(); 
    $status = $responseObject->getResult()->getStatus(); 
    $user = $responseObject->getResult()->getData()->getUser() 

?> 

Die Antwort sieht wie folgt aus:

<response> 
    <transaction_id>1234</transaction_id> 
    <result> 
     <status> 
      <code>1</code> 
      <msg>Success</msg> 
     </status> 
     <data> 
      <user> 
       <fname>Jon</lname> 
       <lname>Doe</lname> 
       <birthday>1986-08-01 00:00:00</birthday> 
      </user> 
     </data> 
    </result> 
</response> 

Jetzt habe ich die folgenden Klassen in PHP.

XMLResponse

class XmlResponse { 

    public $result; #XmlResult Class 
    public $transaction_id; #string 

    public function getArrayCopy() { 
     return get_object_vars($this); 
    } 

    //getter + setter 

} 

XmlResult

class XmlResult { 

    public $data; #XmlData Class 
    public $status; #XmlStatus Class 

    public function getArrayCopy() { 
     return get_object_vars($this); 
    } 

    //getter + setter 

} 

XmlStatus

class XmlStatus { 

    public $code; #string 
    public $msg; #string 

    public function getArrayCopy() { 
    return get_object_vars($this); 
    } 

    //getter + setter 

} 

XmlData

class XmlData { 

    public $user; #User Class 
    public $car; #Car Class 
    public $member; #Member Class 
    public $foo; #Foo Class 

    public function getArrayCopy() { 
     return get_object_vars($this); 
    } 

    //getter + setter 

} 

Benutzer

class User { 

    public $fname; #string 
    public $lname; #string 
    public $birthday; #string 

    public function getArrayCopy() { 
     return get_object_vars($this); 
    } 

    //getter + setter 

} 
+0

Haben Sie überlegt, xpath zu verwenden, um Ihre XML abzufragen? -> http://php.net/manual/de/simplexmlelement.xpath.php – Crisp

Antwort

0

fand ich die beste und einfachste Lösung für mich! Es gibt eine Bibliothek namens Saber, die Objekte zu XML und XML-Objekte unterstützt die Konvertierung: http://sabre.io/xml/

Es kommt mit einigen netten Schnittstellen, die Sie in Ihrem Objektklasse implementieren können, dass die XmlSerialization und XmlDeserialization steuert. Sie definieren also das Mapping für XML-Tags -> Objektvariablen und Objektvariablen -> XML-Tags innerhalb Ihrer Klasse. Danach müssen Sie nur noch die Zuordnung des XML-Tags zur Objektklasse und der Objektklasse zum XML-Tag definieren.

use Sabre\Xml\Service; 
$xml = "<xml></xml>" #your xml as string 
// For XML to object 
$service->elementMap = [ 
    'XMLTAGNAME' => 'MyObject::class', 
    'XMLTAGNAME' => 'MyObject2::class', 
]; 
$service->parse($xml); 

// For object to XML 
$service->classMap = [ 
    'XMLTAGNAME' => MyObject::class, 
    'XMLTAGNAME' => MyObject2::class, 
]; 
$service->write("PARENTXMLTAGNAME", $object); 

Innerhalb der Klasse wird es in etwa so aussehen:

class MyObject implements XmlDeserializable, XmlSerializable { 

    public $variable; 

    function xmlSerialize(Writer $writer) { 
     $writer->write([ 
      'variable' => $this->variable, 
     ]); 
    } 

    static function xmlDeserialize(Reader $reader) { 
     $object = new MyObject(); 
     $keyValue = \Sabre\Xml\Deserializer\keyValue($reader); 
     if (isset($keyValue['variable'])) { 
      $object->variable = $keyValue['variable']; 
     } 
     return $object; 
    } 
    //Getter and Setter 
} 

Installation:

`composer require sabre/xml` 

API-Dokumentation:

XmlSerialization: http://sabre.io/xml/reading/

XmlDeserialization: http://sabre.io/xml/writing/