Intereting Posts
doctrine2 queryBuilder должен возвращать только соответствие результата с значениями массива (ids): 0 / Null и / или один и / или многие id (ы) должны возвращать один результат AddType в htaccess вызывает загрузку страницы Как настроить заголовок ответа HTTP, когда php используется с g-wan MYSQL Выберите одну и ту же таблицу Контроллер нагрузки CodeIgniter в контроллере HMVC Использовать PHP для форматирования входного SQL-запроса как HTML? PHP: отображение страницы загрузки при выполнении скрипта php Laravel 5.2 Не работает PHP Перенаправление на новую страницу после отправки формы Как установить отключенную опцию выбора в Laravel? Как добавить XDebug zend_extension в php.ini? htaccess не работает после перехода с XAMPP на LAMP на ubuntu 13.10 (Включить htaccess на сервере apache linux) Запретить знак доллара из определенных строк Тернарный оператор, не работающий со ссылочными переменными в PHP Как я могу анализировать журнал ошибок Apache в PHP?

Удаление десериализации массива XML

Я использую API, который возвращает XML. Я могу получить одну или несколько учетных записей с API. Я использую JMS Serializer для десериализации этих данных в простые классы моделей, которые будут хранить данные.

Учетная запись выглядит так:

<account href="https://your-subdomain.recurly.com/v2/accounts/1"> ... <account_code>1</account_code> <state>active</state> <username nil="nil"></username> <email>verena@example.com</email> <first_name>Verena</first_name> <last_name>Example</last_name> ... <address>...</address> </account> 

Мне удалось настроить свой объект Account следующим образом, который отлично работает при десериализации:

 <?php namespace Recurly\Model; use JMS\Serializer\Annotation as JMS; /** * @JMS\XmlRoot("account") */ class Account { /** @JMS\Type("string") */ protected $account_code; /** @JMS\Type("string") */ protected $state; /** @JMS\Type("string") */ protected $username; /** @JMS\Type("string") */ protected $email; /** @JMS\Type("string") */ protected $first_name; /** @JMS\Type("string") */ protected $last_name; /** @JMS\Type("string") */ protected $company_name; /** @JMS\Type("string") */ protected $vat_number; /** @JMS\Type("Model\Address") */ protected $address; /** @JMS\Type("string") */ protected $accept_language; /** @JMS\Type("string") */ protected $hosted_login_token; /** @JMS\Type("DateTime") */ protected $created_at; // getters and setters here } 

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

 <accounts type="array"> <account href="https://your-subdomain.recurly.com/v2/accounts/1">...</account> <account href="https://your-subdomain.recurly.com/v2/accounts/2">...</account> <account href="https://your-subdomain.recurly.com/v2/accounts/3">...</account> </accounts> 

Я хотел бы десериализовать это на массив учетных записей. Однако на данный момент единственный способ, который я нашел, заключается в создании второй модели под названием « Accounts которая выглядит так:

 <?php namespace Recurly\Model; use JMS\Serializer\Annotation as JMS; class Accounts { /** * @var Account[] * * @JMS\Type("array<Recurly\Model\Account>") * @JMS\XmlList(entry="account") */ protected $accounts; // getters and setters here } 

При десериализации я должен передать правильный контекст:

 $serializer->deserialize($rawXml, 'Recurly\Model\Account', 'xml'); // or Recurly\Model\Accounts if I get multiple. 

Я нашел где-нибудь (в вопросе SO или в JMS Serializer Github), что вы также можете передавать «типы» в качестве контекста, например $serializer->deserialize($rawXml, 'array<Recurly\Model\Account>', 'xml') но это просто приводит к пусту массива … Кто-нибудь знает, можно ли десериализовать массив без дополнительной модели данных?

Related of "Удаление десериализации массива XML"

Вы можете использовать $ serializer-> deserialize ($ rawXml, 'array', 'xml'), настроив структуру xml (результат и запись являются значениями по умолчанию). В deserialize – $ context есть 4-й параметр, он может переопределять значения по умолчанию, но я не могу найти способ как.

 <result> <entry> <account_code>1</account_code> <state>active</state> <username nil="nil"></username> <email>verena@exampl.com</email> <first_name>Verena</first_name> <last_name>Example</last_name> </entry> <entry> <account_code>1</account_code> <state>active</state> <username nil="nil"></username> <email>verena@exampl.com</email> <first_name>Verena</first_name> <last_name>Example</last_name> </entry> </result>