我们使用JMS serializer创建XML请求并解析来自Sirena-Travel(airticket提供商)的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:lang
属性转换为lang
。DescribeLangElement
类。但这些对我来说似乎有些过分。
是否有直接的方法为JMS序列化器注释指定xml:lang
属性的属性?
答案 0 :(得分:2)
命名空间约束:保留的前缀和命名空间名称
根据定义,前缀 xml 绑定到命名空间名称
http://www.w3.org/XML/1998/namespace
。 可能,但不需要声明,不得未声明或绑定到任何其他命名空间名称。其他前缀不得绑定到此命名空间名称,并且不得声明为默认命名空间。
来自:http://www.w3.org/TR/xml-names11/#xmlReserved
因此,命名空间不是http://example.com/
,而是http://www.w3.org/XML/1998/namespace
。