LINUX.ORG.RU

libXML2 чтение XML из сокета

 ,


0

1

Немного идиотский вопрос, но проверять лень :-)

Хочу парсить на лету XML документ, приходящий по сети. Думаю заюзать для этих целей libXML2. Сможет ли эта библиотека распарсить незаконченный документ? Как она поступит, если, например, закрывающий тег для какого-то элемента еще не пришел? Или же мне придется еще один слой кэширования делать, складывать туда только те элементы, теги которых уже закрыты и только потом отдавать на съедение libXML2?

★★★★★

Последнее исправление: hibou (всего исправлений: 1)

Сможет, смотри исходники перлового модуля XML::LibXML. Кормить libxml можно частями. Минус один - слишком много вызовов. Насчет проверки синтаксиса, я не видел исходники самого libxml2, но думаю там посимвольный парсер, т.е ошибка возникает тогда, когда ожидаемый символ не обнаружен или не верен.

gh0stwizard ★★★★★
()

XML парсер обычно может работать в двух режимах: DOM и SAX.

DOM загружает весь документ целиком и строит дерево из Node, Attr и т.д. SAX ничего не строит и не грузит, а просто вызывает callback функции при поступлении соответствующего тега, что в callback функции при этом делать - решаете сами. Можете сами строить свой аналог DOM дерева например. Постепенно, по мере получения следующих тегов.

anonymous
()
Ответ на: комментарий от gh0stwizard

Насчет проверки синтаксиса, я не видел исходники самого libxml2, но думаю там посимвольный парсер

также думали и ребята из adobe, когда использовали memcpy, которая всегда копировала вперед

cvs-255 ★★★★★
()
Ответ на: комментарий от cvs-255

И чем у них все закончилось? Я что-то сказал не так? XML имеет свободный формат синтаксиса, можно хоть в одну строчку все написать или наоборот с табами, переносами и пробелами. Далее, последовательность полей в тагах не имеет значения. Это все к тому, что данные из файла хоть и можно грузить чанками в 100 мб, но парсинг самого чанка разбирается по одному символу (байту, в случае юникода нескольких байт) в ожидании определенного набора символов (<>=" и т.д.). И так как отсутствие одного символа является критичной ошибкой, то встретив что-то неладное лучше сказать об этом до окончания парсинга много мегабайтного файла (редкость, но не ограничение). И такой алгоритм работает и проверен временем, и да, не идеален.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

И чем у них все закончилось?

тем, что они научились различать memcpy и memmove.

cvs-255 ★★★★★
()
Ответ на: комментарий от hibou

ты с sax никогда не работал что-ли? если тег не будет закрыт (если xml будет синтаксически неверен, если включена валидация и xml невалиден), а поток закончился - парсер выдаст ошибку.

maloi ★★★★★
()
Ответ на: комментарий от maloi

и коллбек вызовется один раз (при открытии тега) а не два (еще и при закрытии)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.