【问题标题】:Deserialize XML element which could have different namespaces反序列化可能具有不同命名空间的 XML 元素
【发布时间】:2019-09-07 11:06:46
【问题描述】:

我正在尝试从一个变量下的 XML 中获取元素,其中我拥有相同的 xml 树,但具有另一个 xml 命名空间前缀。

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

使用 symfony 2.8,JMS/serializer 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>
      ...

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

/**
  * @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: ...
...

【问题讨论】:

    标签: php xml symfony jms-serializer


    【解决方案1】:

    当应用程序必须处理可能位于具有非常相似定义的多个命名空间之一中的输入时,我的建议总是首先使用单个命名空间(通常使用 XSLT)将数据转换为通用形式,然后对那个通用表单进行后续处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      相关资源
      最近更新 更多