【发布时间】: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