XML проблема десериализации с использованием JMS Serializer - мои вложенные объекты равны нулю - PullRequest
0 голосов
/ 06 апреля 2020

У меня возникают проблемы с использованием 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

Большое спасибо, что нашли время прочитать этот пост и Помоги мне !

...