Я пытаюсь получить элемент из 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: ... ...
Когда приложению приходится иметь дело с вводом, который может быть в одном из нескольких пространств имен с очень похожими определениями, я всегда советую начинать с преобразования данных в общую форму с использованием единого пространства имен (обычно с использованием XSLT), а затем выполните последующую обработку в этой общей форме.