Я использую 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 без определения пространства имен, я все равно смог бы разобрать и десериализовать этот файл?Кроме того, как применить пространство имен к корневому элементу, когда я сериализую свой объект?