これは、PHP の xml:lang 解析に関連しています。
JMSシリアライザーを使用して、Sirena-Travel (航空券プロバイダー) への XML 要求を作成し、そこからの 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 シリアライザ アノテーションを使用して属性のプロパティを指定する簡単な方法はありますか?