goetas / xsd2php

Convert XSD into PHP classes and serialize into XML (deserialize too)
149 stars 62 forks source link

xml_list deserialization does not work #122

Open robinlehrmann opened 7 years ago

robinlehrmann commented 7 years ago

Hi,

This yml metadata was generated:

Mobile\Search\SearchResult:
    xml_root_name: search-result
    xml_root_namespace: 'http://services.mobile.de/schema/search'
    properties:
        total:
            expose: true
            access_type: public_method
            serialized_name: total
            xml_element:
                namespace: 'http://services.mobile.de/schema/search'
            accessor:
                getter: getTotal
                setter: setTotal
            type: integer
        pageSize:
            expose: true
            access_type: public_method
            serialized_name: page-size
            xml_element:
                namespace: 'http://services.mobile.de/schema/search'
            accessor:
                getter: getPageSize
                setter: setPageSize
            type: integer
        currentPage:
            expose: true
            access_type: public_method
            serialized_name: current-page
            xml_element:
                namespace: 'http://services.mobile.de/schema/search'
            accessor:
                getter: getCurrentPage
                setter: setCurrentPage
            type: integer
        maxPages:
            expose: true
            access_type: public_method
            serialized_name: max-pages
            xml_element:
                namespace: 'http://services.mobile.de/schema/search'
            accessor:
                getter: getMaxPages
                setter: setMaxPages
            type: integer
        errors:
            expose: true
            access_type: public_method
            serialized_name: errors
            xml_element:
                namespace: 'http://services.mobile.de/schema/common/error-1.0'
            accessor:
                getter: getErrors
                setter: setErrors
            type: array<Mobile\Common\Error\Error>
            xml_list:
                inline: false
                entry_name: error
                namespace: 'http://services.mobile.de/schema/search'
        ads:
            expose: true
            access_type: public_method
            serialized_name: ads
            xml_element:
                namespace: 'http://services.mobile.de/schema/search'
            accessor:
                getter: getAds
                setter: setAds
            type: array<Mobile\Ad\Ad>
            xml_list:
                inline: false
                entry_name: ad
                namespace: 'http://services.mobile.de/schema/search'

I've created the serializer with required handlers:

<?php declare(strict_types = 1);

namespace Mobile\Serializer;

use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler;
use JMS\Serializer\Handler\HandlerRegistry;
use JMS\Serializer\Serializer;
use JMS\Serializer\SerializerBuilder;

class SerializerFactory
{
    private $metaDataDirectory;
    private $prefix;

    public function __construct(string $metaDataDirectory, string $prefix)
    {
        $this->metaDataDirectory = $metaDataDirectory;
        $this->prefix = $prefix;
    }

    public function create(): Serializer
    {
        $serializerBuilder = SerializerBuilder::create();
        return $serializerBuilder
            ->configureHandlers(function (HandlerRegistry $handlerRegistry) use ($serializerBuilder) {
                $serializerBuilder->addDefaultHandlers();
                $handlerRegistry->registerSubscribingHandler(new BaseTypesHandler());
                $handlerRegistry->registerSubscribingHandler(new XmlSchemaDateHandler());
            })
            ->addMetadataDir(
                __DIR__.'/../Resources/'.$this->metaDataDirectory, $this->prefix
            )
            ->build()
        ;
    }
}

xsdconfig:

xsd2php:
  namespaces:
    'http://services.mobile.de/schema/search': 'Mobile\Search'
    'http://services.mobile.de/schema/ad': 'Mobile\Ad'
    'http://services.mobile.de/schema/resource': 'Mobile\Resource'
    'http://services.mobile.de/schema/seller': 'Mobile\Seller'
    'http://services.mobile.de/schema/common/financing-1.0': 'Mobile\Common\Financing'
    'http://services.mobile.de/schema/common/error-1.0': 'Mobile\Common\Error'
  destinations_php:
    'Mobile\Search': Search
    'Mobile\Ad': Ad
    'Mobile\Resource': Resource
    'Mobile\Seller': Seller
    'Mobile\Common\Financing': Common\Financing
    'Mobile\Common\Error': Common\Error
  destinations_jms:
    'Mobile': Resources/serializer
  aliases:
    'http://services.mobile.de/schema/ad':
      class: 'Mobile\Ad\Clazz'
    'http://services.mobile.de/schema/seller':
      value: 'string'
  naming_strategy: short
  path_generator: psr4

If I try to deserialize this response:

I want to deserialize following xml response:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<search:search-result xmlns:seller="http://services.mobile.de/schema/seller"
                      xmlns:ad="http://services.mobile.de/schema/ad"
                      xmlns:search="http://services.mobile.de/schema/search"
                      xmlns:financing="http://services.mobile.de/schema/common/financing-1.0"
                      xmlns:resource="http://services.mobile.de/schema/resource"
                      xmlns:error="http://services.mobile.de/schema/common/error-1.0">
    <search:total>14825</search:total>
    <search:page-size>20</search:page-size>
    <search:current-page>1</search:current-page>
    <search:max-pages>742</search:max-pages>
    <search:ads>
        <ad:ad key="3" url="https://services.mobile.de/search-api/ad/3">
            <ad:creation-date value="2015-12-21T15:47:26+01:00"/>
            <ad:modification-date value="2017-01-13T16:15:10+01:00"/>
            <ad:detail-page url="http://suchen.mobile.de/auto-inserat/mercedes-benz-200-hamburg/3.html"/>
            <!-- [...] -->
        </ad:ad>
<!-- [...] -->

My composer.json:

    "require": {
        "php": "~7.0",
        "symfony/options-resolver": "~2.3|~3.0",
        "goetas-webservices/xsd2php-runtime":"^0.2.2",
        "jms/serializer": "1.5.0-RC1",
        "php-http/guzzle6-adapter": "^1.1",
        "php-http/mock-client": "^0.3"
    },
    "require-dev": {
        "phpunit/phpunit": "^5.7",
        "goetas-webservices/xsd2php":"^0.2"
    },

latests versions are installed.

The property "ads" of "SearchResult" seems to be empty. Do you have any ideas to solve my problem ?

you can clone my repository from here https://github.com/robinlehrmann/mobile-de-api to debug it

Thank you very much!

robinlehrmann commented 7 years ago

We've found the bug of this issue. I can't reference this issue to the actually repository. Due documentation reasons, the library don't parse the ref attribute. Link to issue: https://github.com/goetas-webservices/xsd2php/issues/18