【问题标题】:Error generating XML data生成 XML 数据时出错
【发布时间】:2014-01-10 06:29:17
【问题描述】:

我正在努力生成一个 XML,其中包含从在线商店检索到的特定 XML 格式的产品,以导入批发商网站。它是通过这个网址获得的:

http://movilterra.com/solostocks/

我这样做的方法是将产品数组传递给发送到输出的 XML 模板:

<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
    <SINCRO_DETAILS>
        <COMPANY></COMPANY>
        <COUNTRY>67</COUNTRY>
        <PRODUCTS>
            <?php 
            foreach ($products as $product):
            ?>
                <PRODUCT>
                    <PRODUCT_ID><?php echo $product['id_product'] ?></PRODUCT_ID>
                    <TITLE><?php echo '<![CDATA[' . $product['product_name'] . ']]' ?></TITLE>
                    <DESCRIPTION><?php echo '<![CDATA[' . $product['description_short'] . ']]' ?></DESCRIPTION>
                    <SECTOR><?php echo $product['sector'] ?></SECTOR>
                    <PRICE><?php echo $product['price'] ?></PRICE>
                    <SHIPPING>48</SHIPPING>
                    <MINIMUM><?php echo $product['minimal_quantity'] ?></MINIMUM>
                    <UNIT_TYPE>9</UNIT_TYPE>
                    <PHOTOS>
                        <PHOTO><?php echo $product['imagen'] ?></PHOTO>
                    </PHOTOS>
                    <KEYWORDS>
                        <?php 
                        $keywords = explode(',', $product['meta_keywords']);
                        foreach ($keywords as $keyword):
                            ?>
                            <KEYWORD><?php echo '<![CDATA[' . $keyword . ']]' ?></KEYWORD>
                            <?php 
                        endforeach;
                        ?>
                    </KEYWORDS>
                </PRODUCT>
            <?php 
            endforeach;
            ?>
        </PRODUCTS>
</SINCRO_DETAILS>

注意 CDATA 块,因为它们可能是问题的根源。 所有不是数字的字符串之前都通过一个函数过滤,该函数将它们转换如下:

utf8_encode(preg_replace('/[\[\]\!]|CDATA/i', '', strip_tags($str)))

我使用 utf8_encode() 来防止波浪线和其他字符出错。但是我仍然有这个错误:

第 1247 行第 18 列的错误:文档末尾的额外内容

每次我重新加载 URL 时,错误行都会改变。如果我检查代码,我发现第一个 TITLE 标记(带有 CDATA 块)似乎吞噬了所有其他内容。

您能帮我解决这个问题吗?

【问题讨论】:

  • 不要使用连接字符串来生成 XML,而是使用经过测试并可以完全满足此要求的库。现场有多个入门级相关问答:mysql to php to xml shows blank age。它更容易处理,代码更少,更安全。

标签: php xml validation prestashop cdata


【解决方案1】:

您应该在每个 CDATA 声明的末尾添加一个 >(不仅是 title 元素,所有这些元素),如下所示:

<TITLE><?php echo '<![CDATA[' . $product['product_name'] . ']]>' ?></TITLE>

【讨论】:

  • 也许是因为它很愚蠢?查看实际上为您提供了一些对象来创建 XML 的重复问题,那么您无需担心这些(和其他)问题。正如您可能想象的那样,您不需要自己编写 XML,因为问题已经解决了。
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多