php - 如何高效解析xml数据?

标签 php mysql xml database

我有两个问题:

1-我需要解析XML文件并将数据插入mysql数据库。假设该文件大约 250 kB(但也可能更大)并且有很多子节点,所以我至少需要 3 个表。我用SimpleXml解析了xml并成功将所有数据插入到db中。但对于这个确切的文件,花费了大约 160 秒,这对我来说似乎很长。 有没有一种方法可以在更短的时间内做得更好?

另一个问题是我需要从 URL 获取 XML 文件并将其保存到服务器,但我不知道如何执行此操作...

感谢您的回答。

解析xml的代码

function parse_xml($file=""){
  global $database;
  if(file_exists($file) && !empty($file)){
      $sport = new SimpleXMLElement($file, null, true);    
      $count = count($sport->OddsObject)-1;
      $listAttr = array();
      $start_time = time();
      for($i=0; $i <= $count; $i++){
          $countMatch = count($sport->OddsObject[$i]->Matches->Match)-1;
          //echo $countMatch; 
          for($k=0; $k <= $countMatch; $k++){           
              $OOdata = $sport->OddsObject[$i]->children();
              $columns = array();
              $data = array();
              foreach($OOdata as $key => $value){            
                  if($key != "Matches"){
                      //$listAttr[$i][$key] = $attr;
                      $columns[] = $key;
                      if ($value != "") {
                          $data[] = "'" . $database->escape_value($value) . "'";
                    } else {
                         $data[] = "NULL";
                    }
                }
            }        

            //get matches: MatchId, Date, HomeTeam, AwayTeam
            $Mdata = $sport->OddsObject[$i]->Matches->Match[$k]->children();     
            foreach ( $Mdata as $key => $value) {
                if($key != "OddsData"){    
                    $columns[] = $key;
                    if ($value != "") {
                      $data[] = "'" . $database->escape_value($value) . "'";
                    } else {
                      $data[] = "NULL";
                    }    
                }
            }                      
            $cols = strtolower(implode(",",$columns));
            $values = implode(",",$data);
            $sql = "INSERT INTO sports($cols) values(".$values.")";
            if($database->query($sql)) {
                $last_id = $database->insert_id();

                $countData = count($sport->OddsObject[$i]->Matches->Match[$k]->OddsData)-1;
                for($t=0; $t <= $countData; $t++){
                    //get OddsData: Home-,Draw-, -Away ...
                    $ODdata = $sport->OddsObject[$i]->Matches->Match[$k]->OddsData[$t]->children();
                    foreach($ODdata as $key=>$attr){
                        $MID = $last_id;
                        $new_bet = Bet::make($attr->getName(),$attr, $MID);
                        $new_bet->save(); 

                    }                    
                }
            }
        }
        $end_time = time() - $start_time;
    }    
    return $end_time;
}
else{
    die("The file doesn't exist.");
}
}

最佳答案

从 URL 获取文件并写入文件的一种非常简单的方法是 file_get_contents() 和 file_put_contents()。

SimpleXML 在处理只有 250kb 的文件时应该非常高效且快速。您的缓慢可能与数据库插入有关。尝试将您的插入分组到数据库中。我发现一次运行 50 个插入通常效果最好(但这取决于行大小)。这可能会大大加快整个过程。

关于php - 如何高效解析xml数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6620030/

相关文章:

mysql - SQL 查询显示昨天创建的所有用户,有多少发送的邀请?

java - Spring mvc xml配置错误

php - "key"是MySqli中的保留字吗?我收到错误

linux - XDebug 已安装但未显示在 phpinfo() 中

mysql - 仅第一个开始日期和最后一个完成日期

Eclipse WTP 中的 XML 目录 : How do you reference a standalone XML schema

xml - 使用 UIMA 从 XML 文件中提取文本

php - Laravel - 尝试获取非对象的属性 - PHP

php - 使用映射数组与具有部分键的数组合并关联数组(支持命名参数)

mysql - 将数据从矩阵转换为向量格式