警告:DOMDocument::loadXML():需要开始标记,在实体中找不到“<”

Posted

技术标签:

【中文标题】警告:DOMDocument::loadXML():需要开始标记,在实体中找不到“<”【英文标题】:Warning: DOMDocument::loadXML(): Start tag expected, '&lt;' not found in Entity 【发布时间】:2020-07-16 21:51:59 【问题描述】:

我们从 .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>

【问题讨论】:

那么你将$file 和/或$xsl 传递给loadXML 是什么?带有 XML 或 XSLT 代码的字符串?还是文件名/路径?使用load 方法,而不是loadXML 方法。或者向我们展示一个最小但完整的示例来重现错误,即使用参数调用convert 如果我们从加载中删除 XML 则不可能打开链接,因为产品只能每 20m 导入一次。现在我遇到问题:警告:DOMDocument::load(): I/O 警告:无法加载外部实体 "/home/user/domains/domain.com/public_html/pub/您最多允许每次完全导出20 分钟,最多每分钟一个差异请求在 /home/user/domains/gerris.com/public_html/vendor/firebear/importexport/Model/Output/Xslt.php 第 34 行 这是 PHP 吗?请标记调用 XSLT 的通用语言。此外,您的任何链接都不起作用。请将 XML 和 XSLT 示例发布到帖子正文中。 @Parfait 根据您的建议,我添加了 .xsl 文件代码和生成的 .xml 文件 那么你作为$file$xsl传递给convert函数的参数是什么,这些字符串是带有XML代码和XSLT代码的吗? 【参考方案1】:

我认为错误不在 XSLT 中,而只是在您使用 PHP DOMDocument API 时,它有两种方法,一种称为 load,如果您有 XML 的文件名或文件路径或 URI,您应该使用或 XSLT 您要加载,另一个称为 loadXML 如果您有一个带有 XML 或 XSLT 代码的字符串要解析。

您收到的错误提示您使用loadXML,但不要传递 XML 或 XSLT 代码,而是传递 XML 或 XSLT 代码的文件名或路径或 URI。为此,您应该使用load 方法。

参见http://sandbox.onlinephpfunctions.com/code/f080d3aedcc93d591018902724b7846eb063d36b,它表明$doc-&gt;loadXML('foo.xml') 会生成错误DOMDocument::loadXML(): Start tag expected, '&amp;lt;' not found in Entity,而$doc-&gt;loadXML('&lt;root&gt;test&lt;/root&gt;'); 可以正常工作。因此,在 PHP 代码中将您的 loadXML 调用更改为 load 调用。

【讨论】:

马丁,感谢您的支持。现在我改为从 loadXML 加载,目前收到警告:DOMDocument::load(): Memory allocation failed :达到任意 MAX_URI_LENGTH 限制 /home/usr/domains/mywebsite.com/public_html/vendor/firebear/importexport/Model/Output /Xslt.php 第 34 行 @Sylvester,该错误消息是另一个 PHP/libxslt 用户最近遇到并发布在 *** 上的,我不知道如何解决它,尽管其他问题是由属性中的巨大 base64 编码 data URI。我在你的样本中看不到类似的东西。尽管如此,我认为,如果您在自己的环境中执行 XSLT,我认为最好将这个新问题作为一个单独的问题提出。 另一个同样错误的问题是***.com/questions/60875571/…。 我看到了这篇文章,但我没有看到具体的解决方案。我们应该将脚本添加到 xslt.php 文件中来解决这个问题还是在其他地方寻找解决方案? 很奇怪,因为当我添加到加载 XML 时,我没有得到这个问题。但是当我从加载中删除 XML 时,我得到了这个问题

以上是关于警告:DOMDocument::loadXML():需要开始标记,在实体中找不到“<”的主要内容,如果未能解决你的问题,请参考以下文章

带有 PhpWord 的隐蔽 HTML:错误 - DOMDocument::loadXML(): 实体中未定义 p 上的命名空间前缀 o

DOMDocument::loadXML(): AttValue: &quot; or ' expected in Entity, line: 报错

DOMDocument无法解析XML

CData部分未完成问题

在 PHP 中从 DOMNode 创建 DOMDocument

php 解析xml