Подтвердить что ты не робот

Почему синтаксический анализ sax быстрее, чем синтаксический анализ? и как работает stax?

несколько связан с: libxml2 из java

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

Почему синтаксический анализ sax быстрее, чем разбор dom? Единственное, что я могу придумать, это то, что w/sax вы, вероятно, игнорируете большинство входящих данных и, таким образом, не тратите время на обработку времени части xml, которые вам не нужны. IOW - после разбора с SAX вы не сможете воссоздать исходный ввод. Если вы написали свой SAX-парсер так, чтобы он учитывал каждый xml node (и, таким образом, мог воссоздать оригинал), то это не будет быстрее, чем DOM?

Причина, по которой я спрашиваю, заключается в том, что я пытаюсь быстрее анализировать XML-документы. Мне нужно иметь доступ ко всему дереву xml после рассылки. Я пишу платформу для сторонних сервисов для подключения, поэтому я не могу предвидеть, какие части XML-документа будут необходимы, а какие - нет. Я даже не знаю структуру входящего документа. Вот почему я не могу использовать jaxb или sax. Объем памяти не является проблемой для меня, потому что документы xml небольшие, и мне нужно только 1 в памяти за раз. Это время, которое требуется для анализа этого относительно небольшого документа xml, который убивает меня. Раньше я не использовал stax, но, возможно, мне нужно исследовать дальше, потому что это может быть промежуточная точка? Если я правильно понимаю, stax сохраняет исходную структуру xml и обрабатывает детали, которые я запрашиваю по запросу?. Таким образом, время оригинального анализа может быть быстрым, но каждый раз, когда я прошу его пересечь часть дерева, которое еще не пройдено, что при обработке происходит?

Если вы предоставите ссылку, которая отвечает на большинство вопросов, я приму ваш ответ (вам не нужно напрямую отвечать на мои вопросы, если они уже ответили в другом месте).

обновление: я переписал его в саксофоне, и он анализирует документы на avg 2,1 мс. Это улучшение (на 16% быстрее) в течение 2,5 мс, которое принимал dom, однако это не та величина, которую я (и др.) Мог бы догадаться

Спасибо

4b9b3361

Ответ 1

Предполагая, что вы ничего не делаете, кроме синтаксического анализа документа, ранжирование различных стандартов парсера выглядит следующим образом:

1. StAX является самым быстрым

  • Сообщается о событии

2. SAX следующий

  • Он делает все, что делает StAX, плюс контент реализуется автоматически (имя элемента, пространство имен, атрибуты,...)

3. DOM последний

  • Он делает все, что делает SAX, и представляет информацию как экземпляр Node.

Ваш пример использования

  • Если вам нужно поддерживать весь XML, DOM является стандартным представлением. Он интегрируется с преобразованиями XSLT (javax.xml.transform), XPath (javax.xml.xpath) и валидация схемы (javax.xml.validation) API. Однако, если производительность является ключевой, вы можете создать собственную древовидную структуру с помощью StAX быстрее, чем DOM-парсер может построить DOM.

Ответ 2

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

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

Ответ 3

SAX быстрее, потому что DOM-парсеры часто используют синтаксический анализатор SAX для анализа документа внутри, а затем выполняют дополнительную работу по созданию и манипулированию объектами для представления каждого node, даже если приложение не заботится о них.

Приложение, которое использует SAX напрямую, скорее всего, будет использовать информацию более эффективно, чем DOM "парсер".

StAX - это счастливая среда, где приложение получает более удобный API, чем SAX-ориентированный на события подход, но не страдает от неэффективности создания полного DOM.

Ответ 4

SAX быстрее, чем DOM (обычно чувствуется при чтении большого документа XML), поскольку SAX предоставляет вам информацию как последовательность событий (обычно доступную через обработчик), в то время как DOM создает узлы и управляет структурой создания node до тех пор, пока дерево DOM (как представлено в документе XML).

Для относительно небольших файлов вы не почувствуете эффекта (за исключением того, что DOM создает дополнительную обработку для создания элементов node и/или node).

Я не могу прокомментировать StAX, так как я никогда не играл с ним.