Как добавить пространство имен по умолчанию в (де) сериализованный XML через JMS / Serializer? - PullRequest
0 голосов
/ 08 февраля 2019

Я использую JMS / Serializer (в Laravel).Я сгенерировал файлы * .yml и классы * .php для своего сериализатора.В моем файле yml определены xml_root_name и xml_root_namespace:

App\Test\MyApp\PurchaseOrder:
   xml_root_name: PurchaseOrder
   xml_root_namespace: http::/tempuri.org/Schema.xsd

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

<?xml version="1.0!>
<PurchaseOrder OrderDate="2018-01-01" xmlns="http::/tempuri.org/Schema.xsd">
  ...
</PurchaseOrder>

удачно десериализуется для объекта PurchaseOrder и последующих объектов.Однако без определения пространства имен в корне

<?xml version="1.0!>
<PurchaseOrder OrderDate="2018-01-01">
  ...
</PurchaseOrder>

десериализация является только частичной (то есть только OrderDate десериализуется из XML, а остальные элементы - нет).

Связанная проблема возникает, когда я пытаюсь сериализовать свой собственный объект: в результирующем XML есть все данные, но корневому элементу не определено пространство имен.Т.е. вывод:

<?xml version="1.0!>
<PurchaseOrder OrderDate="2018-01-01">
  ...
</PurchaseOrder>

Настройка для сериализатора:

$builder = SerializerBuilder::create();
$builder->addMetadataDir('metadata', 'App\Test\MyApp\PurchaseOrder');
$builder->configureHandlers(function(HandlerRegistryInterface $handler) use ($builder) {
  $builder->addDefaultHandlers();
  $handler->registerSubscribingHandler(new XmlSchemaDateHandler());
});
$serializer = $builder->build();
...
$object = $serializer->deserialize($xml, 'App\Test\MyApp\PurchaseOrder', 'xml');

Как применить пространства имен по умолчанию в JMS / Сериализаторе, поэтому, если я получуXML без определения пространства имен, я все равно смог бы разобрать и десериализовать этот файл?Кроме того, как применить пространство имен к корневому элементу, когда я сериализую свой объект?

...