XML-файл большого размера. Необходимо удалить определенные узлы. Что использовать?

Placido

Наблюдаю
Есть файл XML размером около 80 МБ (TM TRADOS). Необходимо открыть файл, проверить около 70 тысяч узлов, удалить те из них, у которых есть дочерние узлы с определенным атрибутом, содержащие определенный текст (слово или фраза), а затем сохранить файл под тем же именем. Пробовал с помощью SimpleXML:
PHP:
$xml = new SimpleXMLElement('...') ;
... 
обработка 
... 
$xml->asXML('имя файла');
На небольших файлах работает (проверял на файле весом в 300КБ), но на таком большом объеме данных компьютер виснет и файл не обрабатывается. Что посоветуете использовать?

И еще один вопрос. Когда пробовал обрабатывать с помощью SimpleXML, с небольшим файлом все работало как нужно, но все htmlentities при пересохранении превратились в соответствующие символы (например, " - в кавычки, & apos; - в апострофы и т.д.). Есть ли способ этого избежать?
 

Sender

Новичок
на каком этапе виснет? read файла, обход дерева или сохранение? виснет намертво или просто потихоньку перебирает узлы?

проверка через xpath?


как вариант перегнать xml другой формат, разбить на несколько частей, обработать отдельно и потом слить вместе опять
 

Placido

Наблюдаю
Виснет либо при обходе, либо при сохранении. Точно не могу сказать когда. Если просто прочитать и вывести через print_r(), то информация выводится. Прохожу все узлы через foreach() и проверяю каждый дочерний узел функцией preg_match(), если есть совпадение удаляю узел через unset().

Скорее всего, так и сделаю - разобью на части, обработаю, а потом склею. Просто чувствую, что это не очень хорошо (SimpleXMLElement, насколько я понимаю, читает в память сразу все дерево), должен же быть способ сделать все "правильно", без танцев с бубном. С XML сталкиваюсь впервые, хотелось бы не только выполнить задачу "абы как", но и разобраться на будущее. Подозреваю, что можно как-то использовать XMLReader и XMLWriter, но с ними я пока еще не разобрался.
 

Sender

Новичок
XMLReader может помочь, он потоковый насколько я помню, все дерево в память не требуется загружать.

еще можно xpath для обработки использовать, и конечно лучше всего выяснить где затык. может там и не виснет ничего, просто долго все и надо ускорить, xpath ускорит
 
Сверху