【发布时间】:2014-06-24 14:43:08
【问题描述】:
我们使用JMS serializer 创建 XML 请求并解析来自 Sirena-Travel(机票提供商)的 XML 响应。一个完整的带注释 DTO 系统是围绕这个序列化器构建的,我们不太可能改变它。
有一个我们想要反序列化的响应 XML(与上述问题相同):
<?xml version="1.0" encoding="UTF-8"?>
<answer>
<describe data="aircompany">
<data>
<code xml:lang="ru">FW</code>
<code xml:lang="en">FW</code>
</data>
<data>
<code xml:lang="ru">UT</code>
<code xml:lang="en">ЮТ</code>
</data>
</describe>
</answer>
问题是:如何指定xml:lang属性对应的属性?
这是描述最内层元素的类的样子:
class DescribeData
{
/**
* Codes in various languages.
*
* @Type("array<DescribeLangElement>")
* @XmlList(inline = true, entry = "code")
*/
private $codes = [];
public function getCode($lang)
{
foreach ($this->codes as $code) {
if ($code->getLang() === $lang) {
return $code;
}
}
return null;
}
}
class DescribeLangElement
{
/**
* Element's language code.
*
* Either "en" or "ru".
*
* @Type("string")
* @XmlAttribute
*/
private $lang;
/**
* @Type("string")
* @XmlValue
*/
private $value;
}
显然,序列化程序无法将xml:lang 属性识别为$lang 属性。我尝试了几种方法:
- 将
@SerializedName("xml:lang")添加到$lang属性。 -
添加命名空间注解:
@XmlNamespace(uri = "http://example.com/", prefix = "xml")到父节点或根节点,同时修改
$lang属性上的@XmlAttribute注解看起来像@XmlAttribute(namespace = "http://example.com/")
不用说,其中一个或两个都没有成功。
我还想到了替代解决方案,例如:
- 预处理 XML 以将
xml:lang属性转换为lang。 - 编写自定义反序列化处理程序来处理
DescribeLangElement类。
但这些对我来说似乎有点矫枉过正。
是否有一种直接的方法可以使用 JMS 序列化器注释为 xml:lang 属性指定属性?
【问题讨论】:
标签: php xml jms-serializer