Удаление элементов xml с использованием php из файла с несколькими именованными элементами - PullRequest
0 голосов
/ 19 марта 2011

привет я работаю с XML-файлом, и структура файла похожа на

<ListRecords>
    <record>
</record>

<totalupnow> </totalupnow>

<record>
</record>
<record>
</record>
<record>
</record>
<record>
</record>
<totalupnow> </totalupnow>

</listrecord>

теперь мне нужна программа php, которая просто удаляет <totalupnow> </totalupnow> из этого файла .. файл очень большой по размеру почти 4 ГБС.

пожалуйста, помогите мне ...

или, если есть, я могу только прочитать <record> </record>, оставив <totalupnow> </totalupnow> как есть.

1 Ответ

0 голосов
/ 19 марта 2011

Вы можете использовать синтаксический анализатор потоковой передачи 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"; 
  }
} 

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...