我正在使用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 / Serializer中应用默认名称空间,因此,如果我接收到没有名称空间定义的XML,我仍然能够解析和反序列化此文件?此外,当我序列化对象时,如何将名称空间应用于根元素?