2

これは、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:langJMS シリアライザ アノテーションを使用して属性のプロパティを指定する簡単な方法はありますか?

4

1 に答える 1

3

名前空間の制約: 予約済みのプレフィックスと名前空間名

プレフィックスxmlは、定義により名前空間 name にバインドされていますhttp://www.w3.org/XML/1998/namespace。宣言する必要はありませんが、宣言を解除たり、他の名前空間名にバインドしたりしてはなりません。他のプレフィックスをこの名前空間名にバインドしてはなら、既定の名前空間として宣言してはなりません。

出典: http://www.w3.org/TR/xml-names11/#xmlReserved

したがって、名前空間はhttp://example.com/butではありませんhttp://www.w3.org/XML/1998/namespace

于 2014-08-03T23:22:36.517 に答える