【问题标题】:PHP XML String to complex PHP ClassPHP XML字符串到复杂的PHP类
【发布时间】:2016-12-16 14:35:14
【问题描述】:

我目前正在尝试在 PHP 中重建一些 java 代码。 该代码从给定对象构建 XML 并将 XML 请求发送到后端。后端传递响应。现在我想将 XML 响应转换为某个复杂类的 php 对象。我使用 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()

?>

响应如下所示:

<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

}

Xml状态

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

}

【问题讨论】:

标签: php xml xml-parsing zend-framework2


【解决方案1】:

我找到了最适合我的最简单的解决方案!有一个名为 Sabre 的库,它支持将对象转换为 XML 和 XML 转换为对象: http://sabre.io/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);

在类中,它看起来像这样:

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/

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

【讨论】:

    【解决方案2】:

    序列化是您正在寻找的东西。例如我搜索时的第一个匹配:

    How-to Serialize/Unserialize a SimpleXML Object?

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 2014-04-25
      • 2016-06-20
      • 2012-05-24
      • 2015-05-14
      • 2012-01-28
      • 1970-01-01
      • 2015-05-28
      • 2011-04-07
      相关资源
      最近更新 更多