Быстрая версия:
Каков стандартный (инновационный? Любой?) Способ отлова и обработки ошибок, возникающих в XMLReader из-за некорректного файла - в частности, не экранированных символов.Предварительная подготовка с Tidy (и т. Д.) Не является супер привлекательным вариантом, кто-нибудь знает способ просто пропустить нарушающий узел и двигаться прямо?
Описательная версия:
Мы все знаем, что это не XML, если он не сформирован должным образом, но давайте будем честными - это происходит.Клиент регулярно загружает массивные (50-100 МБ +) XML-файлы, которые необходимо прочитать в mysql.XMLReader - очевидный выбор, и мы написали оболочку, которая хорошо работает для наших нужд.
Иногда возникает ошибка, и read () не в состоянии убить импорт - drat!Почти всегда это не экранированный символ (например, "&"), который все запутывает.В большинстве случаев мы просто заставляем клиента вызывать поставщика данных и требовать, чтобы он исправил свой дефектный файл.К сожалению, поставщики данных не всегда обязательны и / или своевременны.Было бы замечательно, если бы мы могли просто уловить ошибку и перейти прямо к следующему узлу.
Я потратил довольно много времени, пытаясь прочитать / взломать этот узел, и не могу найти ничего, что стоило бы просмотреть.Я что-то упускаю из виду?
Этот вопрос SO казался многообещающим, но он просто не дал никаких результатов.Передача 1 кажется, что он должен попросить Reader о восстановлении, но мы просто не видим никаких попыток / различных сообщений об ошибках и т. Д. Вот соответствующий код, описывающий подход:
$xml->open($file, null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
Я всегда могпредварительная обработка с Tidy, но должен быть лучший способ.
Я рассмотрел несколько более «творческих» подходов, таких как прослушивание следующего Read () с помощью метода try / catch после завершения логики для текущего узла,но это кажется неуклюжим в лучшем случае .Также кажется, что может быть эмуляция Read () с помощью специальной функции / оболочки, которая помогает перемещаться по узлам и включает обработку ошибок, но у меня такое чувство, что я упрощаю вещи.
Итак, подведем итоги: когда read () не удается, как я могу перехватить ошибку и двигаться дальше?Есть ли шанс, что мы увидим, какая ошибка появляется (по крайней мере, сообщение, которое выбросил бы XMLReader)?
$xml = new XMLReader();
$xml->open($file);
while ($xml->read()) {
}