PHP XML 字符串到复数 PHP Class
PHP XML String to complex PHP Class
我目前正在尝试重建 PHP 中的一些 java 代码。
该代码从给定对象构建 XML 并将 XML 请求发送到后端。后端传递响应。现在我想转换某个复杂class的php对象中的XML响应。我使用 SimpleXml 将字符串转换为 class XmlResponse,但我只能从 XmlResponse class 访问 getter 和 setter,而不能访问内部的其他 class XmlResponse Class。
在 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.
中有以下 classes
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
}
序列化是您正在寻找的东西吗?例如,我搜索时的第一个匹配项:
How-to Serialize/Unserialize a SimpleXML Object?
我找到了最适合我的最简单的解决方案!有一个名为 Sabre 的库支持将对象转换为 XML 和将 XML 转换为对象:
http://sabre.io/xml/
它提供了一些不错的接口,您可以在对象 class 中实现这些接口,这些接口控制 XmlSerialization 和 XmlDeserialization。因此,您定义 XML 标签的映射 -> 对象变量 和 对象变量 -> XML 标签 class。之后你只需要定义 XML 标签到对象 class 和对象 class 到 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 中,它看起来像这样:
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 文档:
Xml 序列化:http://sabre.io/xml/reading/
Xml反序列化:http://sabre.io/xml/writing/
我目前正在尝试重建 PHP 中的一些 java 代码。 该代码从给定对象构建 XML 并将 XML 请求发送到后端。后端传递响应。现在我想转换某个复杂class的php对象中的XML响应。我使用 SimpleXml 将字符串转换为 class XmlResponse,但我只能从 XmlResponse class 访问 getter 和 setter,而不能访问内部的其他 class XmlResponse Class。 在 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.
中有以下 classesXmlResponse
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
}
序列化是您正在寻找的东西吗?例如,我搜索时的第一个匹配项:
How-to Serialize/Unserialize a SimpleXML Object?
我找到了最适合我的最简单的解决方案!有一个名为 Sabre 的库支持将对象转换为 XML 和将 XML 转换为对象: http://sabre.io/xml/
它提供了一些不错的接口,您可以在对象 class 中实现这些接口,这些接口控制 XmlSerialization 和 XmlDeserialization。因此,您定义 XML 标签的映射 -> 对象变量 和 对象变量 -> XML 标签 class。之后你只需要定义 XML 标签到对象 class 和对象 class 到 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 中,它看起来像这样:
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 文档:
Xml 序列化:http://sabre.io/xml/reading/
Xml反序列化:http://sabre.io/xml/writing/