我正在使用xsd2php库来解析描述API请求体的XSD。然后使用相同的库(它本身使用jsm-serializer)我尝试序列化对象:
$payload = new TrackRequest;
$searchCriteria = new SearchCriteriaAType;
$searchCriteria->addToConsignmentNumber(11111);
$payload->setSearchCriteria($searchCriteria);
$levelOfDetail = new LevelOfDetailAType;
$levelOfDetail->setSummary(true);
$payload->setLevelOfDetail($levelOfDetail);
使用基本的序列化设置:
$serializerBuilder = SerializerBuilder::create();
$serializerBuilder->addMetadataDir(__DIR__ . '/../../metadata/Tracking', 'TNTExpressConnect\Tracking\XSD');
$serializerBuilder->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy);
$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
$serializerBuilder->addDefaultHandlers();
$handler->registerSubscribingHandler(new BaseTypesHandler()); // XMLSchema List handling
$handler->registerSubscribingHandler(new XmlSchemaDateHandler()); // XMLSchema date handling
});
序列化导致:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<searchCriteria>
<account/>
<alternativeConsignmentNumber/>
<consignmentNumber>
<entry><![CDATA[11111]]></entry>
</consignmentNumber>
<customerReference/>
<pieceReference/>
</searchCriteria>
<levelOfDetail>
<summary>true</summary>
</levelOfDetail>
</result>
关于这个结果,我有几个问题:
<result>
而不是<TrackRequest>
?CDATA
?<entry>
代码,转而为每个条目创建单独的consigmentNumber
代码?<summary>true</summary>
<summary/>
醇>
我想对于每一种情况我都可以创建一个专用的handler,但也许有一个内置的解决方案,我在文档中忽略了(可能有些配置选项可以放在yaml中)
如果我必须创建处理程序,也许有人可以指出更复杂的例子,这解释了如何正确地做到这一点。
我不是注释的忠实粉丝,所以我更喜欢使用单独的配置文件。
提前谢谢。
答案 0 :(得分:1)
你应该看看YAML Reference。可以使用元数据文件设置很多东西。
更改&#34;结果&#34; to&#34; TrackRequest&#34;将此行添加到文件中:
Vendor\MyBundle\Model\ClassName:
xml_root_name: TrackRequest ## Changes the root element
要删除条目中的cdata,请更改属性:
properties:
entry:
xml_element:
cdata: false ## Add this to disable cdata tags
刚遇到与你一样的问题。我希望它有所帮助。