Этот вопрос давно ушел, но я его только нашел. Слава Богу.
Моя проблема в том, что я должен прочитать файл ONIX (данные книги) и сохранить его в нашей базе данных. Я использую simplexml_load раньше, и хотя он использовал много памяти, но все еще хорошо для относительно небольшого файла (до 300 МБ). Вне этого размера это катастрофа для меня.
После прочтения, особенно интерпретации Фрэнсиса Льюиса, я использую комбинацию xmlreader и simplexml. Результат является исключительным, использование памяти невелико и вставляет его в базу данных достаточно быстро для меня.
Вот мой код:
<?php
$dbhost = "localhost"; // mysql host
$dbuser = ""; //mysql username
$dbpw = ""; // mysql user password
$db = ""; // mysql database name
//i need to truncate the old data first
$conn2 = mysql_connect($dbhost, $dbuser, $dbpw);
mysql_select_db($db);
mysql_query ("truncate ebiblio",$conn2);
//$xmlFile = $_POST['xmlFile'];
//$xml=simplexml_load_file("ebiblio.xml") or die("Error: Cannot create object");
$reader = new XMLReader();
//load the selected XML file to the DOM
if (!$reader->open("ebiblio.xml")) {
die("Failed to open 'ebiblio.xml'");
}
while ($reader->read()):
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'product'){
$xml = simplexml_load_string($reader->readOuterXML());
$productcode = (string)$xml->a001;
$title = (string)$xml->title->b203;
$author = (string)$xml->contributor->b037;
$language = (string)$xml->language->b252;
$category = $xml->subject->b069;
$description = (string)$xml->othertext->d104;
$publisher = (string)$xml->publisher->b081;
$pricecover = (string)$xml->supplydetail->price->j151;
$salesright = (string)$xml->salesrights->b090;
@$productcode1 = htmlentities($productcode,ENT_QUOTES,'latin1_swedish_ci');
@$title1 = htmlentities($title,ENT_QUOTES,'latin1_swedish_ci');
@$author1 = htmlentities($author,ENT_QUOTES,'latin1_swedish_ci');
@$language1 = htmlentities($language,ENT_QUOTES,'latin1_swedish_ci');
@$category1 = htmlentities($category,ENT_QUOTES,'latin1_swedish_ci');
@$description1 = htmlentities($description,ENT_QUOTES,'latin1_swedish_ci');
@$publisher1 = htmlentities($publisher,ENT_QUOTES,'latin1_swedish_ci');
@$pricecover1 = htmlentities($pricecover,ENT_QUOTES,'latin1_swedish_ci');
@$salesright1 = htmlentities($salesright,ENT_QUOTES,'latin1_swedish_ci');
$conn = mysql_connect($dbhost, $dbuser, $dbpw);
mysql_select_db($db);
$sql = "INSERT INTO ebiblio VALUES ('" . $productcode1 . "','" . $title1 . "','" . $author1 . "','" . $language1 . "','" . $category1 . "','" . $description1 . "','" . $publisher1 . "','" . $pricecover1 . "','" . $salesright1 . "')";
mysql_query($sql, $conn);
$reader->next('product');
}
endwhile;
?>
Вы читали некоторые из пользователей способствовали примеры в документации PHP? http://www.php.net/manual/en/class.xmlreader.php#61929 может помочь. – mcrumley