如何有效地解析xml数据?
我有2个问题:如何有效地解析xml数据?
1 - 我需要解析XML文件并将数据插入到mysql数据库中。假设文件大约为250 kB(但可能更大),并且它有很多子节点,所以我至少需要3个表。我用SimpleXml解析了xml,并成功地将所有数据插入到了数据库中。但是对于这个确切的文件,大约需要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()。
对于只有250kb的文件,SimpleXML应该是非常高效和快速的。你的缓慢可能与你的数据库插入有关。尝试将插入分组到数据库。我发现每次运行50个插入通常效果最好(这取决于行大小)。这可能会加快整个过程。
感谢给我分组的想法 - 事实上,我将这个功能分成了两个块,因为这些ID是相同的,也是唯一的,并将所有内容写入2个表格中。令人惊讶的是,它只花了30s而不是160.但我仍然不确定我是如何处理从url中读取和保存xml的。不管怎样,谢谢。 –
我假设你有
$dom = new DOMDocument();
...
// read and insert into db
DOM可以使用相比,SAX解析器的内存和cpu一个显著量解析它,你可以尝试注释掉数据库代码并运行它,看它是否使用过很多CPU和RAM,如果是这样的话,你可能想用SAX解析器重新编码它,如here。
您确定瓶颈是XML解析器,而不是您更新数据库的方式吗?你在使用交易吗?你能否显示你的解析代码的相关部分?对于“从URL获取数据”,请进行一些更多搜索,这很常见。 – Mat
我不知道你如何计算你需要3张表,但它肯定会有帮助,如果你有一个样本XML。 – Sukumar
@Mat - 没有垫,我不知道瓶颈是XML解析器...有很多记录来验证,如果我必须确保插入是好的。我在顶部添加代码:) –