【发布时间】:2014-03-20 01:32:37
【问题描述】:
我必须为我的商店解析 3 个远程 XML 文件(产品、价格、类别),其中最大的文件约为 500MB+。我必须解析它们并插入到 mysql 数据库中。
我可以从 2 种格式中选择
- 所有 3 个 XML 文件都压缩在一个 .tar.gz 存档中
- 每一个单独,简单的.xml
所以,基本上我有两个选择(我认为)
- 在流式传输时“随时随地”解析 XML
- 下载压缩的 XML 然后解析它
我对这两个都有问题。
-
在流式传输时“随时随地”解析 XML
$url = "http://example.xml"; $reader = new XMLReader(); $reader->open($url); $item = array(); while ($reader->read()) { switch ($reader->nodeType) { case (XMLReader::ELEMENT): if ($reader->localName == 'item') { $item = array(); $item['id'] = $reader->getAttribute('id'); while ($reader->read()){ if ($reader->nodeType == XMLReader::ELEMENT) { $name = strtolower($reader->localName); $reader->read(); $item[$name] = $reader->value; } if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->localName == 'item') break; } // Yii framework's mysql query Yii::app()->db->createCommand('INSERT INTO `products` (id, name, parent_id, parent_name, brand, image) VALUES ('.$item['id'].', "'.$item['name'].'", '.$item['parent_id'].', "'.$item['parent_name'].'", "'.$item['brand'].'", "'.$item['img'].'") ')->execute(); }} }
此代码在 没有 mysql 查询 下工作正常,但如果我输入它们会引发各种错误
解析器错误:文档末尾有额外内容
- 下载然后解析
说我想解析myxml.tar.gz里面的products.xml,有可能吗?
$url = "compress.zlib:///myxml.tar.gz";
$reader = new XMLReader();
$reader->open($url);
$reader->read();
它说文件是空的
【问题讨论】:
-
如果这是一次性的,请使用 phpMyAdmin 为您导入 XML 文件
-
我必须大约每 2 小时进行一次。不过谢谢!
-
通过批量插入 MySQL,您将获得更高的性能。其次,你可以做一个 CRON 作业,它调用一个存储过程在一个位置加载一个 .XML 文件,以便 MySQL Db 每两小时运行一次。
-
@MackieeE 你的回答让我意识到我提出了一个非常愚蠢的问题。你完全正确。谢谢!
-
@user3328597 这根本不是一个愚蠢的问题! =) 即使存储过程和直接导入也有其自身的局限性,除了空格之外,我什至无法想到对
Extra Content at end of the document的体面答案,在导入之前可能需要修剪..
标签: php mysql xml parsing xmlreader