Вы можете использовать синтаксический анализатор потоковой передачи XML (SAX) для анализа такого файла.Он работает немного иначе, чем DOM-парсер, но взамен он может работать с файлами любого размера.
[...] или, если есть, я могу только прочитать <record> </record>
Для простоты я предполагаю, что ваши <record>
элементы не содержат ничего, кроме текста, и что "read" означает "записать их содержимое на экран".
<?php
$file = "your_big_file.xml";
$xml_parser = xml_parser_create();
// set up some basic parser properties
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
// set up your event handlers
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "contents");
// read the file in 4kb chunks and parse these as they are read
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die( sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
// clean up
xml_parser_free($xml_parser);
// EVENT HANDLERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$in_record = false;
$counter = 0;
$depth = 0;
// this function is called whenever a start element (<foo>) is encountered
function startElement($parser, $name, $attrs) {
global $in_record;
global $depth;
global $counter;
$depth++;
$in_record = ($name == "record");
if ($in_record) {
$counter++;
echo "Record #$counter:\n";
}
}
// this function is called whenever a start element (</foo>) is encountered
function endElement($parser, $name) {
global $in_record;
global $depth;
$depth--;
$in_record = ($name != "record");
}
// this function is called whenever text data is encountered
function contents($parser, $data) {
global $in_record;
if ($in_record) {
echo "\t".$data."\n";
}
}
?>