优化代码以在XML文件中搜索重复记录

时间:2011-07-15 21:29:56

标签: php sql xml

我有一个包含库存的XM​​L文件,大约有20,000件商品。记录有SKU和itemid。我想搜索XML文件并找到重复的SKU。

XML看起来像这样

<SKUDetails>
 <SKU>AAAAA</SKU>
 <Price currencyID="USD">10</Price>
 <Quantity>4</Quantity>
 <ItemID>11111111</ItemID>
</SKUDetails>
<SKUDetails>
 <SKU>BBBBB</SKU>
 <Price currencyID="USD">10</Price>
 <Quantity>10</Quantity>
 <ItemID>2222222</ItemID>
</SKUDetails>

我编写了以下PHP代码来处理这个文件。大约需要500秒。 我遍历xml文件中的每个节点,并将记录添加到sku和itemid的数据库中。如果sku已经存在于数据库中,我添加第二个itemid。

有没有办法对此进行优化,或者有其他方法可以做到这一点。

这是代码

$doc = new DOMDocument;
$doc->load('../_result/'.$_GET["file"].'.xml');
$xpath = new DOMXPath($doc);

$query = "//SKUDetails";
$SKUDetailsNodes = $xpath->query($query);
echo("Total SKUs ".$SKUDetailsNodes->length."<br />\n");

if($SKUDetailsNodes->length > 0) {
 foreach ($SKUDetailsNodes as $node) {
 $query = "//ItemID";
 $ItemIDNodes = $xpath->query($query,$node);
 $ItemID = $ItemIDNodes->item(0)->nodeValue;

 $query = "//SKU";
 $SKUNodes = $xpath->query($query,$node);
 $SKU = $SKUNodes->item(0)->nodeValue;

 if($SKU != '') {
  $insert_query = "IF NOT EXISTS ".
  "(SELECT * FROM dump_inventory WHERE (sku = '$SKU')) ".
  "INSERT INTO dump_inventory (sku,item1) VALUES ('$SKU',$ItemID) ".
  "ELSE ".
  "UPDATE dump_inventory SET item2 = $ItemID WHERE sku = '$SKU'";

  if(!$insert_exec = sqlsrv_query($conn,$insert_query)) {
   print_r(sqlsrv_errors());
  }
 }
}

2 个答案:

答案 0 :(得分:0)

DATCH THE DATABASE!这就是它花了这么长时间的原因。只需将列表保留在内存中即可。即使是20k的物品也没有那么大可以保留在列表中!

答案 1 :(得分:0)

如果它是一对多的关系,你可能不喜欢;我想按照你的方式将它存储在数据库中。我建议使用一张SKU表和一张带SKU表外键引用的项目表。

此外: 我可能会从XML汇编项目数组,然后运行一个insert语句。这可能要快得多。