【问题标题】:JMS Serializer to read xml:lang attributeJMS Serializer 读取 xml:lang 属性
【发布时间】:2014-06-24 14:43:08
【问题描述】:

这与xml:lang parse in PHP有关。

我们使用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


    【解决方案1】:

    命名空间约束:保留前缀和命名空间名称

    前缀 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 2017-12-02
      • 2011-05-18
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      相关资源
      最近更新 更多