这与PHP 中的 xml:lang 解析有关。
我们使用JMS 序列化程序创建 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")
到父节点或根节点,同时修改属性上的
@XmlAttribute
注释$lang
看起来像@XmlAttribute(namespace = "http://example.com/")
不用说,他们中的一个或两个都没有成功。
我还想到了替代解决方案,例如:
- 预处理 XML 以将
xml:lang
属性转换为lang
. - 编写一个自定义的反序列化处理程序来处理
DescribeLangElement
类。
但这些对我来说似乎有点矫枉过正。
是否有一种直接的方法可以xml:lang
使用 JMS 序列化器注释为属性指定属性?