【发布时间】:2013-03-01 19:51:44
【问题描述】:
我遇到了与 09 年发布的 this one 几乎相同的问题。它似乎没有成功解决,我整天都在研究相关问题并实施我发现的建议。
我正在尝试从 XML 源(不是文件)中提取动态(每天更改)数据并插入到 mySQL 数据库中。当我尝试在没有 fwrite 的情况下提取数据时,数据返回时没有输出中的标签/键。因此,我无法正确地将数据分配给特定的数据库字段。
我决定将信息写入一个文件并从那里开始,但文件每次都在 334kb 处中止/“完成”。不幸的是,我是一个 cURL 新手,没有能力确切地了解问题所在。另外,我正在使用 vqMod for OpenCart 来执行此操作,否则我将直接使用 PHP。
我错过了什么?
另外,有没有办法将 xml 拉为数组而不是字符串(从而可能绕过 fwrite 步骤)?或者,我应该写入其他文件类型吗?
感谢任何建议或重定向到我错过的已解决问题。
这是相关代码,注释部分是我尝试过的修复:
$curl = curl_init();
$fp = fopen('dir/file.xml' , "w" );
//w+ will not download any information from the url - file is created but empty.
//AS IS, downloads first 334KB of file then lands on a blank page
//and a 500 error when any of these other options are implemented.
curl_setopt($curl, CURLOPT_URL, 'http://www.url.com');
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
// curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($curl, CURLOPT_TIMEOUT, 300);
// curl_setopt($curl, CURLOPT_NOPROGRESS, false);
// curl_setopt($curl, CURLOPT_RANGE, '0-1000');
// $data = array();
$data = curl_exec($curl);
fwrite($fp, $data);
curl_close($curl);
fclose($fp);
更新: 尝试使用 simplexml_load_string 而不是 fwrite() 来提取一个产品的信息,但仍然取得了有限的成功。我正在使用的 XML 示例:
<?xml version="1.0"?>
<response>
<root>
<part>
<![CDATA[PARTNUM]]>
</part>
<errorcode>0</errorcode>
<errormsg></errormsg>
<special>N</special>
<description>
<![CDATA[]]>
</description>
<price>75</price>
<weight>1.02</weight>
<webpurch>Y</webpurch>
<altnum>
<![CDATA[ALT-NUM]]>
</altnum>
<active>Y</active>
<redo>
<![CDATA[]]>
</redo>
<codes>
<code>
<fieldname>
<![CDATA[Mfr Part No]]>
</fieldname>
<fieldvalue>
<![CDATA[PARTNUM]]>
</fieldvalue>
</code>
<code>
<fieldname>
<![CDATA[Special Code 1]]>
</fieldname>
<fieldvalue>
<![CDATA[XYZ123]]>
</fieldvalue>
</code>
</codes>
<customtag>N</customtag>
<onhand>0</onhand>
<notes>
<![CDATA[PRODUCT-SPECIFIC NOTE]]>
</notes>
<mfr>
<mfr_name>
<![CDATA[MFR]]>
</mfr_name>
</mfr>
<altpartnums>
<altnum>
<![CDATA[PARTNUM.12]]>
</altnum>
</altpartnums>
<gtrue>N</gtrue>
<group>
<![CDATA[GROUP NAME]]>
</group>
<categories>
<cat>294</cat>
<cat>475</cat>
</categories>
</root>
</response>
这是当我不使用 fwrite() 时多个产品返回 $data 的示例:
0
ñ
75
1.02
是
是
ñ
0
ñ
294
475
0
ñ
288
12
是
是
是
18
是
222
456
3786
【问题讨论】:
-
simplexml_load_file/simplexml_load_string, php.net/manual/en/function.simplexml-load-file.php 怎么样,它可能会这样做,它本身并没有给你一个数组,但它确实给你一个非常容易处理的对象,如何文件大吗? -
file_get_contents 在这里也不起作用吗?
-
@NathanMann,它会,但它仍然需要解析,simplexml_load_file 和 PHP 中的类似解决它。
-
@Guy:该文件的长度各不相同——它是一个活跃(超过 30,000 个)产品的列表,其中一些相关数据来自 Unix 服务器。每天,列表都略有不同。在我要转换的旧系统上,我有一个类似创建的 .csv,通常约为 23MB。
-
@Guy:不,我不控制列表中包含的实际数据。每个产品的细节总是相同的(这就是我通常使用标签进行分配的原因),但是产品本身是由其他人输入/编辑的,没有办法知道某人何时发生了变化一个小细节。本质上,如果我必须对数据库中的产品进行增量更改,我每天都会手动更新。我正在测试 simplexml_load_file,会将结果添加到初始帖子中。
标签: php curl xml-parsing dynamic-data fwrite