Предупреждение: DOMDocument :: load XML (): ожидается начальный тег, '<' не найден в Entity - PullRequest
0 голосов
/ 04 апреля 2020

Мы импортируем товары из файла. xml

Чтобы правильно импортировать товары, нам сначала нужно было создать файл .xsl, который преобразует файл. xml в наши требования из URL ссылки.

Ссылка на файл. xml выглядит следующим образом: https://www.importfilexml.de/restful/export/api/products.xml?acceptedlocales=en_US&output-filetype=xml

Когда я вставляю ссылку с тегом, в качестве примера выберите один бренд: https://www.importfilexml.de/restful/export/api/products.xml?acceptedlocales=en_US&output-filetype=xml&tag_1=Love+Moschino

тогда работай правильно. Но когда я вставляю ссылку на полный каталог товаров: https://www.importfilexml.de/restful/export/api/products.xml?acceptedlocales=en_US&output-filetype=xml

Then during validate convert from .xsl to .xml I get issue:
Warning: DOMDocument::loadXML(): Start tag expected, '&lt;' not found in Entity, line: 1 in /home/usr/domains/mywebsite.pl/public_html/vendor/firebear/importexport/Model/Output/Xslt.php on line 34

код файла .xslt. php:

    /**
     * @param $file
     * @param $xsl
     * @return string
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function convert($file, $xsl)
    {
        if (!class_exists('\XSLTProcessor')) {
            throw new LocalizedException(__(
                'The XSLTProcessor class could not be found. This means your PHP installation is missing XSL features.'
            ));
        }
        $xmlDoc = new \DOMDocument();

        $xmlDoc->loadXML($file, LIBXML_COMPACT | LIBXML_PARSEHUGE | LIBXML_NOWARNING);

        $xslDoc = new \DOMDocument();
        $xslDoc->loadXML($xsl, LIBXML_COMPACT | LIBXML_PARSEHUGE | LIBXML_NOWARNING);

        $proc = new \XSLTProcessor();
        $proc->registerPHPFunctions();
        $proc->importStylesheet($xslDoc);
        try {
            $newDom = $proc->transformToDoc($xmlDoc);
        } catch (\Exception $e) {
            throw new LocalizedException(__("Error : " . $e->getMessage()));
        }

        return $newDom->saveXML();
    }
}

. xml :

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <product>
        <sku>CPW88FXXCD_002_L34_32</sku>
        <group>106003</group>
        <product_from_website>brand</product_from_website>
        <url_key>panasonic-Trousers-Men-MW0MW02349-grey-32</url_key>
        <name>panasonic Trousers Men MW0MW02349 grey</name>
        <custom_name>panasonic Trousers Men</custom_name>
        <description>&lt;div class='pdbDescContainer'&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Collection:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;Spring/Summer&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Gender:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;Man&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Type:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;Trousers&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Fastening:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;&lt;span class='pdbDescSectionList'&gt;&lt;span class='pdbDescSectionItem'&gt;buttons&lt;/span&gt;&lt;span class='pdbDescSectionItem'&gt;zip&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Pockets:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;4&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Material:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;&lt;span class='pdbDescSectionList'&gt;&lt;span class='pdbDescSectionItem'&gt;cotton 96%&lt;/span&gt;&lt;span class='pdbDescSectionItem'&gt;elastane 4%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Pattern:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;checkered&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Washing:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;&lt;span class='pdbDescSectionList'&gt;&lt;span class='pdbDescSectionItem'&gt;wash at 30° C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Model height, cm:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;185&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Model wears a size:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;32&lt;/span&gt;&lt;/div&gt;&lt;div class='pdbDescSection'&gt;&lt;span class='pdbDescSectionTitle'&gt;Details:&lt;/span&gt;&lt;span class='pdbDescSectionText'&gt;&lt;span class='pdbDescSectionList'&gt;&lt;span class='pdbDescSectionItem'&gt;visible logo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</description>
        <qty>3</qty>
        <price>88.50</price>
        <special_price>44.50</special_price>
        <weight />
        <color>grey</color>
        <gender />
        <ean>8719255365841</ean>
        <brand>panasonic</brand>
        <length />
        <size>32</size>
        <categories>Clothing/Trousers/Men</categories>
        <product_online>1</product_online>
        <group>106003</group>
        <product_websites>base</product_websites>
        <attribute_set_code>Default</attribute_set_code>
        <product_type>simple</product_type>
        <image>https://www.importwebsite.com/prod/stock_product_image_106003_2086033795.jpg</image>
        <additional_images>https://www.importwebsite.com/prod/stock_product_image_106003_2086033795.jpg,https://www.importwebsite.com/prod/stock_product_image_106003_343223477.jpg,https://www.importwebsite.com/prod/stock_product_image_106003_287457799.jpg,https://www.importwebsite.com/prod/stock_product_image_106003_570760537.jpg</additional_images>
    </product>

1 Ответ

1 голос
/ 05 апреля 2020

Я думаю, что ошибка не в XSLT, а просто в использовании вами PHP DOMDocument API, у него есть два метода, один из которых называется load, который следует использовать, если у вас есть имя файла или путь к файлу или URI для XML или XSLT, который вы хотите загрузить, и другой, называемый loadXML, который вы должны использовать, если у вас есть строка с XML или XSLT-кодом, который вы хотите проанализировать.

Полученная ошибка предлагает вам использовать loadXML, но не передавайте XML или XSLT-код, а имя файла или путь или URI XML или XSLT-кода. Для этого вам следует использовать метод load.

См. http://sandbox.onlinephpfunctions.com/code/f080d3aedcc93d591018902724b7846eb063d36b, который демонстрирует, что $doc->loadXML('foo.xml') генерирует ошибку DOMDocument::loadXML(): Start tag expected, '&lt;' not found in Entity, тогда как $doc->loadXML('<root>test</root>'); будет работать нормально. Поэтому измените ваши loadXML звонки на load звонки в PHP коде.

...