Десериализовать элемент XML, который может иметь разные пространства имен - PullRequest
2 голосов
/ 17 апреля 2019

Я пытаюсь получить элемент из XML в одной переменной, где у меня такое же дерево xml, но с другим префиксом пространства имен xml.

У меня много похожих элементов, и было бы неприятно писать 3х одинаковых классов или элементов и проверять, если один из них равен нулю (избегая исключений).

Использование 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>
      ...

Прямо сейчас я обрабатываю это, генерируя другие элементы и проверяя, не является ли один из них нулевым. Но написание следующих элементов для других пространств имен делает мою библиотеку моделей действительно огромной.

/**
  * @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 переменными с другим геттером / сеттером, подобным этому:

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

Хотите получить только одну переменную независимо от изменений префикса пространства имен:

Dokument:
    opisDokumentu: ...
...

1 Ответ

0 голосов
/ 17 апреля 2019

Когда приложению приходится иметь дело с вводом, который может быть в одном из нескольких пространств имен с очень похожими определениями, я всегда советую начинать с преобразования данных в общую форму с использованием единого пространства имен (обычно с использованием XSLT), а затем выполните последующую обработку в этой общей форме.

...