У меня возникают проблемы с использованием JMS Serializer в моем проекте Symfony 3. (я работаю над Ubuntu) Когда я десериализовал XML ниже, используя следующие строки кода:
$xmlContent = file_get_contents($filePath);
$order = $this->getContainer()->get('jms_serializer')->deserialize($xmlContent, 'AppBundle\xml\ORDER', 'xml');
Я получил этот объект (это результат var_dump моего объекта $ order):
object(AppBundle\xml\ORDER)#647 (5) {
["version":"AppBundle\xml\ORDER":private]=>
string(3) "1.0"
["type":"AppBundle\xml\ORDER":private]=>
string(8) "standard"
["oRDERHEADER":"AppBundle\xml\ORDER":private]=>
NULL
["oRDERITEMLIST":"AppBundle\xml\ORDER":private]=>
array(0) {
}
["oRDERSUMMARY":"AppBundle\xml\ORDER":private]=>
NULL
}
OrderHeader, OrderItemList и OrderSummary имеют значение NULL, в отличие от XML.
XML содержимого (в файле $ filePath) :
<?xml version="1.0" encoding="utf-8"?>
<ORDER version="1.0" type="standard" xlmns="http://www.opentrans.org/XMLSchema/1.0">
<ORDER_HEADER>
<CONTROL_INFO>
<GENERATOR_INFO>created</GENERATOR_INFO>
<GENERATION_DATE>2020-01-08T15:08:04+01:00</GENERATION_DATE>
</CONTROL_INFO>
<ORDER_INFO>
<ORDER_ID>20-165686</ORDER_ID>
<ORDER_DATE>2020-01-08T15:06:51+01:00</ORDER_DATE>
<ORDER_PARTIES>
<BUYER_PARTY>
<PARTY>
<ADDRESS>
<NAME>
<![CDATA[Lefrancais]]>
</NAME>
<NAME2>
<![CDATA[François]]>
</NAME2>
<NAME3>
<![CDATA[Rue Anselme]]>
</NAME3>
<STREET>
<![CDATA[Anselme]]>
</STREET>
<STREETNUMBER>
<![CDATA[12]]>
</STREETNUMBER>
<STREETAFFIX>
<![CDATA[]]>
</STREETAFFIX>
<ZIP>
<![CDATA[93400]]>
</ZIP>
<CITY>
<![CDATA[Saint-Ouen]]>
</CITY>
<COUNTRY>
<![CDATA[FR]]>
</COUNTRY>
<PHONE type="private">
<![CDATA[0411442255]]>
</PHONE>
<EMAIL>
<![CDATA[francois@gmail.com]]>
</EMAIL>
</ADDRESS>
</PARTY>
</BUYER_PARTY>
<INVOICE_PARTY>
<PARTY>
<ADDRESS>
<NAME>
<![CDATA[Lefrancais]]>
</NAME>
<NAME2>
<![CDATA[François]]>
</NAME2>
<NAME3>
<![CDATA[Rue Anselme]]>
</NAME3>
<STREET>
<![CDATA[Anselme]]>
</STREET>
<STREETNUMBER>
<![CDATA[12]]>
</STREETNUMBER>
<STREETAFFIX>
<![CDATA[]]>
</STREETAFFIX>
<ZIP>
<![CDATA[94555]]>
</ZIP>
<CITY>
<![CDATA[Saint-gilles]]>
</CITY>
<COUNTRY>
<![CDATA[FR]]>
</COUNTRY>
<PHONE type="private">
<![CDATA[0444112255]]>
</PHONE>
<EMAIL>
<![CDATA[francois@gmail.com]]>
</EMAIL>
</ADDRESS>
</PARTY>
</INVOICE_PARTY>
<SHIPMENT_PARTIES>
<DELIVERY_PARTY>
<PARTY>
<ADDRESS>
<NAME>
<![CDATA[Lefrancais]]>
</NAME>
<NAME2>
<![CDATA[François]]>
</NAME2>
<NAME3>
<![CDATA[Rue Anselme]]>
</NAME3>
<STREET>
<![CDATA[Anselme]]>
</STREET>
<STREETNUMBER>
<![CDATA[12]]>
</STREETNUMBER>
<STREETAFFIX>
<![CDATA[]]>
</STREETAFFIX>
<ZIP>
<![CDATA[93555]]>
</ZIP>
<CITY>
<![CDATA[Saint-gilles]]>
</CITY>
<COUNTRY>
<![CDATA[FR]]>
</COUNTRY>
<PHONE type="private">
<![CDATA[0411223366]]>
</PHONE>
<EMAIL>
<![CDATA[francois@gmail.com]]>
</EMAIL>
</ADDRESS>
</PARTY>
</DELIVERY_PARTY>
</SHIPMENT_PARTIES>
</ORDER_PARTIES>
<PRICE_CURRENCY>EUR</PRICE_CURRENCY>
</ORDER_INFO>
<ORDER_FEATURES>
<FEATURE>
<FNAME>
<![CDATA[PaymentType]]>
</FNAME>
<FVALUE>
<![CDATA[ADV]]>
</FVALUE>
</FEATURE>
<FEATURE>
<FNAME>
<![CDATA[DeliveryType]]>
</FNAME>
<FVALUE>
<![CDATA[PAKET]]>
</FVALUE>
</FEATURE>
<FEATURE>
<FNAME>
<![CDATA[PaymentStatus]]>
</FNAME>
<FVALUE>
<![CDATA[UNKNOWN]]>
</FVALUE>
</FEATURE>
<FEATURE>
<FNAME>
<![CDATA[PaymentReference]]>
</FNAME>
<FVALUE>
<![CDATA[UNKNOWN]]>
</FVALUE>
</FEATURE>
</ORDER_FEATURES>
</ORDER_HEADER>
<ORDER_ITEM_LIST>
<ORDER_ITEM>
<LINE_ITEM_ID>2537642</LINE_ITEM_ID>
<ARTICLE_ID>
<SUPPLIER_AID/>
<DESCRIPTION_SHORT>
<![CDATA[Mann-Filter Filtre d'urée]]>
</DESCRIPTION_SHORT>
<MANUFACTURER_INFO>
<MANUFACTURER_NAME>
<![CDATA[Mann-Filter]]>
</MANUFACTURER_NAME>
<MANUFACTURER_AID>
<![CDATA[U100210]]>
</MANUFACTURER_AID>
</MANUFACTURER_INFO>
</ARTICLE_ID>
<QUANTITY>1</QUANTITY>
<ORDER_UNIT>C62</ORDER_UNIT>
<ARTICLE_PRICE type="gros_list">
<PRICE_AMOUNT>0.68</PRICE_AMOUNT>
<PRICE_LINE_AMOUNT>0.68</PRICE_LINE_AMOUNT>
<TAX>0.19</TAX>
<TAX_AMOUNT>0.10857142857143</TAX_AMOUNT>
</ARTICLE_PRICE>
</ORDER_ITEM>
<ORDER_ITEM>
<LINE_ITEM_ID>shipping</LINE_ITEM_ID>
<ARTICLE_ID>
<SUPPLIER_AID>-1</SUPPLIER_AID>
<DESCRIPTION_SHORT>
<![CDATA[Lieferkosten (Paketdienst)]]>
</DESCRIPTION_SHORT>
</ARTICLE_ID>
<QUANTITY>1</QUANTITY>
<ORDER_UNIT>C62</ORDER_UNIT>
<ARTICLE_PRICE type="gros_list">
<PRICE_AMOUNT>0.01</PRICE_AMOUNT>
<PRICE_LINE_AMOUNT>0.01</PRICE_LINE_AMOUNT>
<TAX>0.19</TAX>
<TAX_AMOUNT>0.0015966386554622</TAX_AMOUNT>
</ARTICLE_PRICE>
</ORDER_ITEM>
<ORDER_ITEM>
<LINE_ITEM_ID>payment</LINE_ITEM_ID>
<ARTICLE_ID>
<SUPPLIER_AID>-2</SUPPLIER_AID>
<DESCRIPTION_SHORT>
<![CDATA[Zahlungskosten (Vorkasse per Überweisung)]]>
</DESCRIPTION_SHORT>
</ARTICLE_ID>
<QUANTITY>1</QUANTITY>
<ORDER_UNIT>C62</ORDER_UNIT>
<ARTICLE_PRICE type="gros_list">
<PRICE_AMOUNT>0</PRICE_AMOUNT>
<PRICE_LINE_AMOUNT>0</PRICE_LINE_AMOUNT>
<TAX>0</TAX>
<TAX_AMOUNT>0.00</TAX_AMOUNT>
</ARTICLE_PRICE>
</ORDER_ITEM>
</ORDER_ITEM_LIST>
<ORDER_SUMMARY>
<TOTAL_ITEM_NUM>3</TOTAL_ITEM_NUM>
<TOTAL_AMOUNT>0.57983193277311</TOTAL_AMOUNT>
</ORDER_SUMMARY>
</ORDER>
Я указываю, что сгенерировал PHP классы и YML-файлы из xsd, используя этот пакет: https://github.com/goetas-webservices/xsd2php
My PHP Соответствующие classe s расположены здесь: / var / www/symfony/tn/src/AppBundle/xml И файлы YML расположены здесь: / var / www/symfony/tn/src/AppBundle/xml/metadata
Я приведу пример одного из классов PHP и YML, сгенерированных здесь:
Содержимое / var / www/symfony/tn/src/AppBundle/xml/ORDER.php:
<?php
namespace AppBundle\xml;
/**
* Class representing ORDER
*/
class ORDER
{
/**
* @var string $version
*/
private $version = null;
/**
* @var string $type
*/
private $type = null;
/**
* @var \AppBundle\xml\ORDERHEADER $oRDERHEADER
*/
private $oRDERHEADER = null;
/**
* @var \AppBundle\xml\ORDERITEM[] $oRDERITEMLIST
*/
private $oRDERITEMLIST = null;
/**
* @var \AppBundle\xml\ORDERSUMMARY $oRDERSUMMARY
*/
private $oRDERSUMMARY = null;
/**
* Gets as version
*
* @return string
*/
public function getVersion()
{
return $this->version;
}
/**
* Sets a new version
*
* @param string $version
* @return self
*/
public function setVersion($version)
{
$this->version = $version;
return $this;
}
/**
* Gets as type
*
* @return string
*/
public function getType()
{
return $this->type;
}
/**
* Sets a new type
*
* @param string $type
* @return self
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Gets as oRDERHEADER
*
* @return \AppBundle\xml\ORDERHEADER
*/
public function getORDERHEADER()
{
return $this->oRDERHEADER;
}
/**
* Sets a new oRDERHEADER
*
* @param \AppBundle\xml\ORDERHEADER $oRDERHEADER
* @return self
*/
public function setORDERHEADER(\AppBundle\xml\ORDERHEADER $oRDERHEADER)
{
$this->oRDERHEADER = $oRDERHEADER;
return $this;
}
/**
* Adds as oRDERITEM
*
* @return self
* @param \AppBundle\xml\ORDERITEM $oRDERITEM
*/
public function addToORDERITEMLIST(\AppBundle\xml\ORDERITEM $oRDERITEM)
{
$this->oRDERITEMLIST[] = $oRDERITEM;
return $this;
}
/**
* isset oRDERITEMLIST
*
* @param int|string $index
* @return bool
*/
public function issetORDERITEMLIST($index)
{
return isset($this->oRDERITEMLIST[$index]);
}
/**
* unset oRDERITEMLIST
*
* @param int|string $index
* @return void
*/
public function unsetORDERITEMLIST($index)
{
unset($this->oRDERITEMLIST[$index]);
}
/**
* Gets as oRDERITEMLIST
*
* @return \AppBundle\xml\ORDERITEM[]
*/
public function getORDERITEMLIST()
{
return $this->oRDERITEMLIST;
}
/**
* Sets a new oRDERITEMLIST
*
* @param \AppBundle\xml\ORDERITEM[] $oRDERITEMLIST
* @return self
*/
public function setORDERITEMLIST(array $oRDERITEMLIST)
{
$this->oRDERITEMLIST = $oRDERITEMLIST;
return $this;
}
/**
* Gets as oRDERSUMMARY
*
* @return \AppBundle\xml\ORDERSUMMARY
*/
public function getORDERSUMMARY()
{
return $this->oRDERSUMMARY;
}
/**
* Sets a new oRDERSUMMARY
*
* @param \AppBundle\xml\ORDERSUMMARY $oRDERSUMMARY
* @return self
*/
public function setORDERSUMMARY(\AppBundle\xml\ORDERSUMMARY $oRDERSUMMARY)
{
$this->oRDERSUMMARY = $oRDERSUMMARY;
return $this;
}
}
Содержимое / var / www/symfony/tn/src/AppBundle/xml/metadata/ORDER.yml
AppBundle\xml\ORDER:
xml_root_name: ORDER
xml_root_namespace: 'http://www.opentrans.org/XMLSchema/1.0'
properties:
version:
expose: false
access_type: public_method
serialized_name: version
accessor:
getter: getVersion
setter: setVersion
xml_attribute: true
type: string
type:
expose: true
access_type: public_method
serialized_name: type
accessor:
getter: getType
setter: setType
xml_attribute: true
type: string
oRDERHEADER:
expose: true
access_type: public_method
serialized_name: ORDER_HEADER
xml_element:
namespace: 'http://www.opentrans.org/XMLSchema/1.0'
accessor:
getter: getORDERHEADER
setter: setORDERHEADER
type: AppBundle\xml\ORDERHEADER
oRDERITEMLIST:
expose: true
access_type: public_method
serialized_name: ORDER_ITEM_LIST
xml_element:
namespace: 'http://www.opentrans.org/XMLSchema/1.0'
accessor:
getter: getORDERITEMLIST
setter: setORDERITEMLIST
type: array<AppBundle\xml\ORDERITEM>
xml_list:
inline: false
entry_name: ORDER_ITEM
skip_when_empty: false
namespace: 'http://www.opentrans.org/XMLSchema/1.0'
oRDERSUMMARY:
expose: true
access_type: public_method
serialized_name: ORDER_SUMMARY
xml_element:
namespace: 'http://www.opentrans.org/XMLSchema/1.0'
accessor:
getter: getORDERSUMMARY
setter: setORDERSUMMARY
type: AppBundle\xml\ORDERSUMMARY
Наконец, я копирую сюда вставку: мой файл / var / www/symfony/tn/app/config/config.yml соответствует Конфигурация сериализатора jms:
jms_serializer:
handlers:
datetime:
default_format: "Y-m-d\\TH:i:sP" # ATOM
default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set
array_collection:
initialize_excluded: false
metadata:
directories:
AppBundle:
namespace_prefix: "AppBundle\\xml"
path: "%kernel.project_dir%/src/AppBundle/xml/metadata"
Я думаю, что мои YML-файлы, описывающие PHP классы, не загружены. Чтобы проверить это, я обновляю свой файл ORDER.yml и устанавливаю для свойства version значение false (см. Соответствующий код ниже), а поле «версия» по-прежнему отображается в var_dump объекта $ order, как видно из верхнего.
AppBundle\xml\ORDER:
xml_root_name: ORDER
xml_root_namespace: 'http://www.opentrans.org/XMLSchema/1.0'
properties:
version:
expose: false
access_type: public_method
serialized_name: version
accessor:
getter: getVersion
setter: setVersion
xml_attribute: true
type: string
Я уточняю, что я, очевидно, много занимался веб-документацией и документацией по JMS Serializer, но все же застрял: s
Большое спасибо, что нашли время прочитать этот пост и Помоги мне !