Даны два XML-файла, которые имеют одинаковую информацию в другом формате. Оба должны быть десериализованы в одну и ту же сущность Symfony:
1.
<?xml version="1.0" encoding="iso-8859-1" ?>
<Request xmlns:dxn="http://defaultxmlnamespace.org" xmlns:axn="http://anotherxmlnamespace.org">
<dxn:Id>123456</dxn:Id>
<axn:Name>JohnDoe</axn:Name>
</Request>
2.
<?xml version="1.0" encoding="iso-8859-1" ?>
<Request xmlns="http://defaultxmlnamespace.org" xmlns:axn="http://anotherxmlnamespace.org">
<Id>123456</Id>
<axn:Name>JohnDoe</axn:Name>
</Request>
В первом примере пространство имен зарегистрировано с префиксом «dxn», а во втором оно задано как пространство имен по умолчанию. Моя сущность (без получения / установки) выглядит так:
private $dxnId;
private $axnName;
Я использую «NameConverterInterface» для преобразования имени узла из «dxn: Id» в «dxnId», поскольку двоеточия нельзя использовать в имени элемента Entity. Но это не работает в обоих случаях, так как префикс «dxn» известен сериализатору только в примере №. 1.
Мой обходной путь теперь состоит в том, чтобы отобразить данные в массив и манипулировать ими там, прежде чем сопоставить их с сущностью. Я думаю, что сохранение пространства имен в имени элемента Entity не лучший вариант, но я должен сохранить информацию о пространстве имен для последующей сериализации.
Так каков наилучший способ десериализации такой структуры?
Вы можете включить зависимость JMSSerializer в ваш проект для управления сериализацией / десериализацией xml для сущностей, если это уместно. Это действительно сильный инструмент сериализации, который имеет специальную аннотацию @XmlNamespace с параметром тега, который решает ваш случай. Вот ссылка: https://jmsyst.com/libs/serializer
Других решений пока нет …