Разница между DOM и SAX Parser — очень популярный вопрос на собеседовании по Java, который часто задают на собеседованиях по Java и XML. Оба парсера — DOM и SAX — широко используются для чтения и разбора XML-файлов в приложениях Java, и оба имеют свои собственные преимущества и недостатки.
В этой статье мы перечислим некоторые существенные и легко заметные различия между обоими анализаторами.
1. Анализатор DOM
DOM-парсер — это API на основе дерева. API на основе дерева сосредоточено вокруг древовидной структуры и, следовательно, предоставляет интерфейсы для компонентов дерева(которое является документом DOM), таких как интерфейс Document, интерфейс Node, интерфейс NodeList, интерфейс Element, интерфейс Attr и т. д.
- Парсер DOM создает древовидную структуру в памяти из входного документа, а затем ждет запросов от клиента. Парсер DOM всегда обслуживает весь документ, независимо от того, сколько его на самом деле нужно клиенту.
- При использовании DOM-анализатора вызовы методов в клиентском приложении должны быть явными и образовывать своего рода цепочку вызовов методов.
2. SAX-парсер
SAX-парсер — это API на основе событий. Обычно API на основе событий предоставляет интерфейсы для обработчиков. Существует четыре интерфейса обработчиков: интерфейс ContentHandler, интерфейс DTDHandler, интерфейс EntityResolver и интерфейс ErrorHandler.
- Парсер SAX не создает никакой внутренней структуры. Вместо этого он воспринимает вхождения компонентов входного документа как события и сообщает клиенту, что он читает, по мере того, как он читает входной документ.
- Парсер SAX в любой момент времени всегда обслуживает клиентское приложение только фрагментами документа.
- С помощью парсера SAX некоторые пользовательские методы вызываются [методы обратного вызова], когда происходят определенные события во время разбора документа XML. Эти методы не обязательно должны вызываться явно клиентом, хотя мы могли бы вызывать их явно.
3. Разница между парсерами DOM и SAX XML
Давайте составим краткий список отличий, который легко запомнить.
DOM(объектная модель документа)
- Анализирует весь документ
- Представляет результат в виде дерева
- Позволяет вам искать по дереву
- Позволяет изменять дерево
- Подходит для чтения файлов данных/конфигурации.
САКСО
- Анализирует, пока вы не скажете ему остановиться
- Запускает обработчики событий для каждого:
- Начальный тег
- Тело тега
- Конечный тег
- API низкого уровня
- Подходит для очень больших документов, особенно если вам нужны только очень небольшие части документа.
4. Как выбрать между парсерами DOM и SAX?
В идеале хороший парсер должен быть быстрым(эффективным по времени), компактным, богатым по функциональности и простым в использовании. Но в реальности ни один из основных парсеров не обладает всеми этими функциями одновременно. Например, парсер DOM богат по функциональности(потому что он создает дерево DOM в памяти и позволяет вам повторно обращаться к любой части документа и изменять дерево DOM), но он неэффективен по пространству, когда документ большой, и требуется немного больше времени, чтобы научиться работать с ним.
Однако SAX Parser гораздо более эффективен в случае большого входного документа(потому что не создает внутренней структуры). Более того, он работает быстрее и его легче изучить, чем DOM Parser, потому что его API действительно прост. Но с точки зрения функциональности он предоставляет меньше функций, что означает, что пользователи сами должны заботиться о большем, например, о создании собственных структур данных.
Я думаю, ответ на самом деле зависит от характеристик вашего приложения и ваших текущих требований.
5. Можно ли одновременно использовать парсеры SAX и DOM?
Да, конечно, потому что использование парсера DOM и парсера SAX является независимым. Например, если вашему приложению нужно работать с двумя документами XML и делать разные вещи с каждым документом, вы можете использовать парсер DOM для одного документа и парсер SAX для другого, а затем объединить результаты или заставить обработку взаимодействовать друг с другом.