Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂PHP类的PHP XML字符串_Php_Xml_Xml Parsing_Zend Framework2 - Fatal编程技术网

复杂PHP类的PHP XML字符串

复杂PHP类的PHP XML字符串,php,xml,xml-parsing,zend-framework2,Php,Xml,Xml Parsing,Zend Framework2,我目前正在尝试用PHP重建一些java代码。 代码从给定对象构建XML,并将XML请求发送到后端。后端提供响应。现在,我想在某个复杂类的php对象中转换XML响应。我使用SimpleXml将字符串转换为XmlResponse类,但我只能从XmlResponse类访问getter和setter,而不能访问XmlResponse类中的其他类。 在Java中,我只是使用JAXB,但我不确定这样做是否可行。问题是,数据标记可能会随着请求的不同而变化,根据请求传递其他对象 我正在使用以下设置: PHP

我目前正在尝试用PHP重建一些java代码。 代码从给定对象构建XML,并将XML请求发送到后端。后端提供响应。现在,我想在某个复杂类的php对象中转换XML响应。我使用SimpleXml将字符串转换为XmlResponse类,但我只能从XmlResponse类访问getter和setter,而不能访问XmlResponse类中的其他类。 在Java中,我只是使用JAXB,但我不确定这样做是否可行。问题是,数据标记可能会随着请求的不同而变化,根据请求传递其他对象

我正在使用以下设置:

  • 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()

?>
现在我有以下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

}
XML数据

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

}
使用者


这是你要找的东西。例如,我搜索时的第一个匹配:


我找到了最好、最简单的解决方案!有一个名为Sabre的库,它支持将对象转换为XML,并将XML转换为对象:

它提供了一些很好的接口,您可以在对象类中实现这些接口,这些接口控制XmlSerialization和XmlDeserialization。因此,在类中定义XML标记->对象变量和对象变量->XML标记的映射。之后,您只需定义XML标记到对象类和对象类到XML标记的映射

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);
安装:

`composer require sabre/xml`
API文档:

XML序列化:


XmlDeserialization:

您考虑过使用xpath查询xml吗?-->
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);
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`