Игнор ошибок структуры

OZ

Новичок
Игнор ошибок структуры

Здравствуйте.
Нужно с помощью XML-парсера разобрать документ.
Вопрос: Как заставить его игнорировать ошибки?
В описании xml_parser_set_option нет такой настройки, но должен же быть игнор ошибок.
 

booter

Новичок
По логике вещей - никак. Потому как любой документ должен быть well-formed, иначе при разборе будт проблемы в виде утечек памяти и прочей неприятной ерунды.
 

OZ

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

olpa

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

В противном случае это не XML-парсер.
 

OZ

Новичок
Нет, это принцип XML-валидатора, а не парсера.

-~{}~ 15.10.05 14:29:

Пришлось сделать так:
Текст передаю парсеру по символам - пока не найдена ошибка, записываю текст в строку массива. Как только найдена ошибка - создаётся новый элемент массива (и новый ресурс парсера), куда будет записываться текст до новой ошибки.
Потом этот массив "правильных" текстов по очереди прохожу xml_parse_into_struct, чтобы вытащить нужное из текста.

Очень грязное решение по объёму затраченых ресурсов. Но решать задачу нужно.
Если предложите лучший вариант - буду очень благодарен.
 

Steamroller

Новичок
OZ, я не знаю, подойдет ли для xml (это обычно для битого html используется) - может имеет смысл попробовать прогонять через tidy, а затем - отдавать в dom-парсер уже.
 

booter

Новичок
Давайте пойдем немного от другого - зачем Вам это надо и какую задачу с помощью такого парсера Вы хотите решить?

Как вариант - можно попробовать автоматически распознавать и исправлять ошибки (на худой конец - выбрасывать битый код) и повторно прогонять через парсер. В принципе, можно написать и свой (грамматика у XML не сильно сложная), но на PHP это делать неэффективно.
 

OZ

Новичок
booter
Как вариант - можно попробовать автоматически распознавать и исправлять ошибки (на худой конец - выбрасывать битый код) и повторно прогонять через парсер.
Я же примерно это и сделал.
Нужно найти аттрибуты у нескольких элементов документа.
Писать свой парсер, регулярными выражениями, например - ещё больше ресурсов потратится, скорость и эффективность тоже слабее.
Я думаю, тут может помочь только одно: как-то запретить PHP-шному XML-парсеру останавливаться на ошибкх. Но, видимо, это не предусмотрено (в мануале таких опций нет).
Спасибо всем, кто предложил свои варианты.
Надо ещё dom-парсеры попробовать.
 

Crazy

Developer
Автор оригинала: OZ
Нет, это принцип XML-валидатора, а не парсера.
Не надо пороть чушь, дружок. XML-валидатор проверяет ошибки в well-formed XML. XML-парсер может парсить только well-formed XML.

Странная хрень, которую ты пытаешься делать, не имеет к XML никакого отношения.

-~{}~ 16.10.05 20:10:

Автор оригинала: OZ
Надо ещё dom-парсеры попробовать.
Господи... Какая каша в голове...
 

OZ

Новичок
Я тебе не "дружок", crazy. К зеркалу подойди - хами сколько хочешь.
Валидатор, к твоему сведению, лишь проверяет, валидна структура или нет. А парсер - разбирает эту структуру. И ему ЛЕГКО может попасться неправильная структура - ответ на эту ситуацию зависит от разработчика парсера. Я, кстати, не собирался даже писать XML-парсер.
Слова хрень и чушь более применимы к твоему сообщению, чем к тому, что я делаю.

И ещё: если нечего ответить по теме - нафиг пишешь? Самоутверждаешься? Крут, не спорю, много полезных советов дал.
 

booter

Новичок
Автор оригинала: OZ
Я думаю, тут может помочь только одно: как-то запретить PHP-шному XML-парсеру останавливаться на ошибкх.
Хм. Если задача - вытащить значения некторых атрибутов - то, возможно, поиск по регулярному выражению скорее всего и будет оптимальным решением. Я, правда, слабо себе представляю неправильно сформированный XML, потому как на него можно натянуть XSL-шкуру, преобразующую его, допустим, в SQL и дальше просто выплюнуть полученые запросы в СУБД.
 

OZ

Новичок
Я пробовал вытащить регулярными - получилось 134 строки кода - вместо 20 строк XML-функциями (и работает медленнее). Парсится WML-документ, а там очень гибкая структура - нужно предусматривать много вариантов. Кстати, по скорости - летает :)

А вот XSL - вариант. Надо попробовать. Спасибо, Booter.
 

booter

Новичок
WML, насколько я знаю, вольностей не позволяет. Так что может все и получится. Удачи.
 

Crazy

Developer
Автор оригинала: OZ
Валидатор, к твоему сведению, лишь проверяет, валидна структура или нет. А парсер - разбирает эту структуру. И ему ЛЕГКО может попасться неправильная структура - ответ на эту ситуацию зависит от разработчика парсера.
К твоему сведению, дружок, ответ на эту ситуацию. специфицирован стандартом. Если на вход парсера подан well-formed XML, то он его успешно разбирает.

Если не well-formed, то на выхое нет ничего.

И ещё: если нечего ответить по теме - нафиг пишешь?
Еще раз пишу по теме: ты делаешь хрень и чушь. По двум причинам:

1. Ты не врубаешься в XML. Соответственно, к решению твоей задачи использование XML-парсера не имеет никакого отношения.
2. Ты сам не понимаеь чего хочешь.

-~{}~ 17.10.05 08:46:

Автор оригинала: booter
Я, правда, слабо себе представляю неправильно сформированный XML
Лови:

Код:
<foo><bar buzz="></foo>

, потому как на него можно натянуть XSL-шкуру, преобразующую его, допустим, в SQL и дальше просто выплюнуть полученые запросы в СУБД.
Ты бредишь еще сильнее OZ'а. Каким образом ты собираешься "натянуть XSL-шкуру" на нечто, не являющеемя well-formed XML? Ты знаешь волшебное мумбо-юмбо?
 

OZ

Новичок
Crazy, ты гей? Я повторюсь, я тебе не "дружок".
Я мог тебе ответить по всем вопросам, но.. Ты того не стоишь.
Я сделал то, что хотел. Тему можно закрыть.
 

Crazy

Developer
Автор оригинала: OZ
Crazy, ты гей?
Вынужден тебя огорчить: нет.

Я мог тебе ответить по всем вопросам, но.. Ты того не стоишь.
Я сделал то, что хотел. Тему можно закрыть.
Т.е. ты таки научил XML-парсер игнорировать ошибки, но мне назло никому не скажешь, как этого добился?

Можешь считать, что мы тебе верим -- если тебе так легче.
 

[DAN]

Старожил PHPClub
Так, личные беседы в сторону, все высказываются по существу вопроса.

OZ, с версией PHP 5.1.0 появилась возможность обрабатывать ошибки libxml. Подробности есть в мануале.
 

Crazy

Developer
[DAN]
, фраза "обрабатывать ошибки" подразумевает, что при обнаружении ошибки я могу ее исправить и продолжить парсинг?
 

[DAN]

Старожил PHPClub
Это означает, что скрипт не вывалится с сообщением о внутренней ошибке.
Что заначит "исправить"? Для придания документу статуса well-formed есть tidy. Естесственно, парсер не будет делать разбор неправильного XML-документа.
Проанализировать ошибку(и), с которой вывалилась libxml можно.
К тому же exсeption handling тоже никто не отменял.
 
Сверху