反序列化可能具有不同名称空间的XML元素

时间:2019-04-17 08:49:13

标签: php xml symfony jms-serializer

我试图从一个变量下的XML获取元素,其中我具有相同的xml树,但是具有另一个xml名称空间前缀。

我有很多相似的元素,而编写3x相同的类或元素并验证其中之一是否为null(避免异常)会很烦人。

使用symfony 2.8,JMS /序列化器1.5.0

XML看起来像这样:

<Dokument xmlns:wnio="http://crd.gov.pl/wzor/2013/12/12/1410/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://crd.gov.pl/wzor/2013/12/12/1410/ http://crd.gov.pl/wzor/2013/12/12/1410/schemat.xsd">
      <wnio:OpisDokumentu>
          ...
      </wnio:OpisDokumentu>
      ...

并这样:

<Dokument xmlns:pos="http://crd.gov.pl/xml/schematy/UPO/2008/05/09/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://crd.gov.pl/wzor/2013/12/12/1410/ http://crd.gov.pl/wzor/2013/12/12/1410/schemat.xsd">
      <pos:OpisDokumentu>
          ...
      </pos:OpisDokumentu>
      ...

现在,我通过生成另一个元素并检查其中一个元素是否不为null来处理此问题。但是为另一个名称空间编写next元素会使我的模型库变得非常庞大。

/**
  * @Serializer\Type("MyBundle\Model\OpisDokumentu")
  * @Serializer\XmlElement(namespace="http://crd.gov.pl/wzor/2013/12/12/1410/")
  * @Serializer\SerializedName("OpisDokument")
  * @Serializer\Expose
  */
private $opisDokumentuWnio;

/**
  * @Serializer\Type("MyBundle\Model\OpisDokumentu")
  * @Serializer\XmlElement(namespace="http://crd.gov.pl/xml/schematy/UPO/2008/05/09/")
  * @Serializer\SerializedName("OpisDokument")
  * @Serializer\Expose
  */
private $opisDokumentuPos;
...
//getters/setters

在这种情况下,我得到了带有2个变量的对象以及另一个这样的getter / setter:

Dokument:
    opisDokumentuWnio: ...
    opisDokumentuPos: null
...

仅想实现一个变量,而不管名称空间前缀是否更改:

Dokument:
    opisDokumentu: ...
...

1 个答案:

答案 0 :(得分:0)

当应用程序必须使用定义非常相似的多个命名空间之一处理输入时,我的建议始终是从使用单个命名空间(通常使用XSLT)将数据转换为通用形式开始,然后对该通用表格进行后续处理。