2016-08-10 10 views
1

現在、PHPでいくつかのJavaコードを再構築しようとしています。 コードは、指定されたオブジェクトからXMLを構築し、XML要求をバックエンドに送信します。バックエンドは応答を返します。今私は特定の複雑なクラスのPHPオブジェクト内のXML応答を変換したい。私は、SimpleXmlを使用して文字列をクラスXmlResponseに変換しましたが、XmlResponseクラス内のゲッターとセッターにしかアクセスできず、XmlResponseクラス内の他のクラスにはアクセスできません。 Javaでは、単にJAXBを使用しますが、このようなことが可能かどうかはわかりません。問題は、リクエストに応じてデータタグを変更して、リクエストに応じて他のオブジェクトを配信できることです。私は次のセットアップを使用していますPHP XML複雑なPHPクラスへの文字列

  • PHP 5.6または7

  • Zendの2または3

ご挨拶!

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

?> 

応答は次のようになります:

<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> 

は、今私は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 

} 

ユーザー

class User { 

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

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

    //getter + setter 

} 
+0

xpathを使用してxmlをクエリすることを検討しましたか? - > http://php.net/manual/ja/simplexmlelement.xpath.php – Crisp

答えて

0

は、私は私のために最善かつ最も簡単な解決策を見つけました! http://sabre.io/xml/

それはあなたがXmlSerializationとXmlDeserializationを制御し、あなたのオブジェクトクラス内に実装することができますいくつかの素晴らしいインターフェースを思い付く:オブジェクトにXMLおよびXMLにオブジェクトを変換をサポートしていサーベルと呼ばれるライブラリがあります。したがって、XMLタグ - >オブジェクト変数オブジェクト変数 - > XMLタグのマッピングをあなたのクラス内で定義します。その後、XMLタグのオブジェクトクラスへのマッピングとオブジェクトクラスのXMLタグへのマッピングを定義するだけで済みます。

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 
} 

インストール::

`composer require sabre/xml` 

APIドキュメント:

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

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); 

クラス内では、このようになります。XmlDeserialization:http://sabre.io/xml/writing/