gpt4 book ai didi

php - XMLReader 错误

转载 作者:行者123 更新时间:2023-11-29 03:35:47 32 4
gpt4 key购买 nike

我必须为我的商店解析 3 个远程 XML 文件(产品、价格、类别),其中最大的大约有 500MB+。我必须解析它们并插入到 mysql 数据库中。

我可以从两种格式中选择

  1. 所有 3 个 XML 文件压缩在一个 .tar.gz 存档中
  2. 每个单独的,简单的.xml

所以,基本上我有 2 个选择(我认为)

  1. 在流式传输时“随时随地”解析 XML
  2. 下载压缩后的XML并解析

这两个我都有问题。

  1. 在流式传输时“随时随地”解析 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 查询 时工作正常,但如果我放置它们会抛出各种错误

parser error : Extra content at the end of the document

  1. 下载然后解析

假设我想在 myxml.tar.gz 中解析 products.xml,这可能吗?

    $url = "compress.zlib:///myxml.tar.gz";
$reader = new XMLReader();
$reader->open($url);
$reader->read();

它说文件是空的

最佳答案

我做的事情和你一样。

我已经从压缩了 3 个 xml 大文件的 web 服务 zip 存档中下载。我这样做:在初始化时我设置:

ini_set('max_execution_time', 1000); //600 seconds

ini_set('mysql.connect_timeout', 1000); //run large sql

ini_set('default_socket_timeout', 1000);

我将 zip 文件下载到临时文件夹:

  /**
* Metoda care scrie arhiva pe hardisc
* @param $string textul de scris in fisierul zip
* @return string Calea catre fisiser
*/
private function write_to_file($string)
{

$base = $this->tmpPath;
$date_folder = $base.date('Y_m').DIRECTORY_SEPARATOR.date('d');

if(!file_exists($date_folder))
{
mkdir($date_folder, 0777, TRUE);
}

$file = $date_folder.DIRECTORY_SEPARATOR.'products_'.date("Y_m_d_H_i").'.zip';

// This uses less memory than file_put_contents
$f = fopen($file, 'w');
fwrite($f, $string);
fclose($f);

return $file;
}

在此之后,我将 xml 文件从 zip 解压缩到临时文件夹:

    public function dezarhiveaza($file)
{
$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
$zip->extractTo($this->tmpPath);
$zip->close();
$this->write_log('extract success');
} else {
$this->write_log('error ');
}
}

接下来我从 XML 中提取产品列表,并使用 1000 行插入 MySQL 查询:

private function deserializeazaForme()
{
$formePath=$this->tmpPath.
"data".DIRECTORY_SEPARATOR.'forme.xml';
$xml = simplexml_load_file($formePath);
$forme = $xml->xpath('//Table');
if($forme)
{
$strFormeInsertFirst="INSERT INTO `forme` (`id`, `denumire`) VALUES ";
$strFormeInsert=$strFormeInsertFirst;
foreach ($forme as $key=>$forma) {
$strFormeInsert .= "(".$forma->id.",'".$forma->denumire."),";
if($key%1000==0 && $key >0){
$strFormeInsert = rtrim($strFormeInsert, ",") ;
$strFormeInsert .=";";
$this->runQuery($strFormeInsert);
$strFormeInsert=$strFormeInsertFirst;
}
}
$strFormeInsert = rtrim($strFormeInsert, ",") ;
$strFormeInsert .=";";
$this->runQuery($strFormeInsert);
}
}

关于php - XMLReader 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21885245/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com