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

Popoff

popoff.donetsk.ua
OZ
В HTML можно писать значения атрибутов без кавычек, оставлять незакрытые теги, писать имена тегов/атрибутов большими или маленькими буквами, на выбор - все должно показываться правильно или хотябы настолько правильно, насколько это возможно. В новой версии - XHTML (а так же в упоминавшемся здесь WML, и в XML вообще) - подобных вольностей нет. Как Вы думаете, почему? Кто и зачем это запретил?

Ответ "чтобы упростить жизнь программисту" является лишь очень маленьким кусочком реальности.
 

Bermuda

Новичок
Честно мне вообще непонятно как именно можно обрабатывать не well-formed XML. Я вообще не понимаю, как его трактовать. Выкинуть кусок? Добавить закрывающий тэг? Поместить значения атрибута в ковычки? Но кто дал такое право? Почему выкидывается какой-то определенный кусок, по какому критерию определяется его начало и конец? Почему решено, что закрывающий тэг должен быть именно здесь? Почему именно эта часть текста определена как атрибут и заключается в ковычки?

Разрулите мне пжста неправильные XML

1. <i><b>Some text</i>
a) <i><b>Some</b> text</i>
b) <i><b>Some text</b></i>

2. <tag atribute=value>some text</tag>more text</tag>
a) <tag atribute="value">some text</tag>more text
b) <tag atribute="value &gt; some text">more text</tag>

Какой из вариантов трактования будет верным и самое главное почему.
 

Crazy

Developer
Не-well-wormed XML можно обрабатывать, если заранее знать его структуру. И иметь более-менее волюнтаристский набор правил по обработке типовых ошибок.

Пример: имеем XML-документ, содержащий разделы, в каждом из которых могут быть параграфы. И получаем на вход текст:

Код:
<section><p>Foo
<section><p>Bar</p></section>
Встретив второй <section> мы фиксируем наличие ошибки и -- совершенно волюнтаристски -- решаем, что весь фрагмент "<section><p>Foo" нужно отбросить.

На практике это не применяется никогда. Ибо если на входе ожидается нечто такое, то сразу пишется свой парсер -- иначе код обработки особых случаев будет больше кода парсера. :)

И словом XML это уже не называют. Иначе можно дойти жо бреда типа "исходные тексты на C++ представляют собой немножко некоррректные XML-документы".
 

Bermuda

Новичок
Если я правильно понял, то Не-well-wormed XML не является XML, т. е. Не-well-wormed XML не существует. Значит XML всегда well-wormed. В таком случае нам не обязательно говорить, что XML well-wormed. Достаточно сказать XML это или текст чем-то напоминающий XML. Я правильно понимаю?

-~{}~ 17.10.05 15:00:

OZ, если это так, то XML не может содержать ошибок структуры, и, следовательно, игнорировать нечего.
 

OZ

Новичок
Ну почему ж так категорично? Если в XML не хватет одного символа, чтобы быть well-formed, это не значит, что документ НЕ XML. Ведь все (или почти все) данные в нём сохранены - их можно (и мне нужно) вытащить - как это сделать, если XML-документ содержит ошибки структуры, я написал ранее.

Booter, использование XSL никак не повлияло на алгоритм и я отказался от XSL.

Popoff, я знаю про "вольности", но всё же WML и XML по прежнему позволяют некоторые "вольности". а жаль.

Bermuda, (и все, кто утверждают, что даже с ошибкой в один символ нельзя разобрать XML-документ), прочитайте, пожалуйста, мой пост выше (почти в начале) - я написал, как разобрать структуру с ошибками.

По приведённым примерам:
1. <i><b>Some text</i>

"Some text" можно вытащить - это аттрибут (данные, которые хранятся и которые нам нужны).

a) <i><b>Some</b> text</i>
тут вообще всё верно по XML

b) <i><b>Some text</b></i>
и тут тоже

2. <tag atribute=value>some text</tag>more text</tag>
можно вытащить и "some text" и "more text"

a) <tag atribute="value">some text</tag>more text
можно вытащить и "some text" и "more text" и "value"

b) <tag atribute="value &gt; some text">more text</tag>
вытащится "value &gt; some text" (и будет корректно) и "more text"

P.S.: Критикам: не заставляйте меня оправдываться за моё же решние. Я же попросил, есть вариант лучше - предложите. Пока я слышал вариант только от Booter'a, а остальные все говорят, почему я не могу решить эту задачу, хотя я её уже решил.
 

Bermuda

Новичок
Ну почему ж так категорично? Если у человека не хватет головы, чтобы быть живым человеком, это не значит, что этот кусок мяса не человек. Ведь все (или почти все) органы в нём сохранены - и мне нужно с этим человеком поговорить - как это сделать, если у человека нет головы, я написал ранее.
 

OZ

Новичок
Я написал уже по поводу критики. Если нет головы - можно взять все остальные части тела. В моём случае разговоры проводить не надо. Если вдруг надо - то не факт, что отрезана будет именно голова - критичные ошибки бывают, но не все ошибки являются критичными. Например, с человеком без руки можно беседовать сколько угодно.

Ещё раз, блин, прошу: есть вариант сделать лучше чем я - скажите, буду благодарен. Нету? Тогда зачем сюда писать?
 

Crazy

Developer
Автор оригинала: OZ
1. <i><b>Some text</i>

"Some text" можно вытащить - это аттрибут (данные, которые хранятся и которые нам нужны).
Агащазблин. Поскольку потом может вдруг оказаться, что ошибка вовсе не в том, что пропущен </b> перед </i>, а пропущен </b> перед text.

Гадание на кофейной гуще.
 

Bermuda

Новичок
OZ
Циферками я пометил НЕ well-formed XML, а буковками варианты их правки. Поскольку вариантов больше одного, то одного решения нет.
 

OZ

Новичок
2 Crazy:
Пофиг, что пропущено. "Some text" будет вытащен.
Хочешь мне помочь? Кривые ухмылки мне нафиг не нужны.
"Гадание на кофейной гуще" это варианты развития ситуации. Чем больше вариантов предусмотрено, тем лучше.

2 Bermuda:
Я не парсер. Передай парсеру - пусть он разбирается. Я сказал, как пропарсить игнорируя ошибки - пробуй, если тебе это нужно. Если тебе это поможет решить какую-либо задачу, я буду рад.
 

[DAN]

Старожил PHPClub
OZ, какая у тебя версия php, какой парсер используешь?
Приведи, пожалуйста, пример кода, где ты "текст передаешь парсеру по символам".
Эти данные внесут ясность в обсуждение проблемы.
Иначе разговор превращается в беспредметный.
 

OZ

Новичок
PHP Version 4.3.10, встроенный XML-парсер.
PHP:
        $c=strlen($xmltext);
        for ($i=0;$i<$c;$i++)
        {
                $symbol=substr($xmltext,$i,1);
                if (!xml_parse($p,$symbol))
                ...
 
Сверху