Чим відрізняється SAX від DOM?


242

Я прочитав деякі статті про парсер XML і натрапив на SAX та DOM .

SAX - це подія на базі подій, і DOM - це модель дерева - я не розумію відмінностей між цими поняттями.

З того, що я зрозумів, на основі подій означає, що з вузлом відбувається якась подія. Як і коли один клацає певний вузол, він видасть усі підвузли, а не завантажує всі вузли одночасно. Але у випадку розбору DOM він завантажить усі вузли та зробить модель дерева.

Чи правильно я розумію?

Будь ласка, виправте мене, якщо я помиляюся, або поясніть мені модель подій та дерева більш простим способом.


Правильно кажучи, DOM не є парсером. Будь-яке дане програмне забезпечення на основі DOM може або не може включати розбір розмітки, і більшість програмного забезпечення HTML DOM робить. Але DOM - це зовсім окрема річ, яка взагалі може не бути пов’язаною з будь-яким форматом серіалізації.
Bob77

Відповіді:


305

Ну, ти поруч.

У SAX події ініціюються під час розбору XML . Коли аналізатор аналізує XML і наштовхується на тег, що починається (наприклад <something>), він запускає tagStartedподію (фактична назва події може відрізнятися). Аналогічно, коли кінець тегу досягається під час розбору ( </something>), він запускається tagEnded. Використання аналізатора SAX означає, що вам потрібно обробляти ці події та мати сенс для даних, що повертаються з кожною подією.

У DOM жодних подій, що запускаються під час розбору. Весь XML аналізується, і DOM-дерево (з вузлів у XML) генерується та повертається. Після розбору користувач може переміщатися по дереву для доступу до різних даних, раніше вбудованих у різні вузли XML.

Загалом, DOM простіший у використанні, але має накладні витрати на аналіз всього XML, перш ніж ви зможете його використовувати.


135
+1 - для уточнення: використовуйте аналізатор DOM з меншими файлами, які вміщуються в оперативній пам'яті. Використовуйте SAX-аналізатор для великих файлів, які зазвичай не використовуються.
Річард Н

дякую @spartkymat Але в разі SAX-події, чи зможе SAX-аналізатор дізнатися, який конкретний дочірній вузол є дитиною конкретного батька? Або просто розбереться? наприклад. У мене є одна <компанія>, а дитина - <employee>. Тож у цьому випадку ця компанія та працівник будуть просто розібрані або це покаже відношення, що компанія є батьком працівника?
user414967

4
Це буде лише розбирати. Таку інформацію вам доведеться зберігати самостійно (через державну машину чи іншим способом). Тим більше привід використовувати аналізатор DOM (якщо ресурси дозволяють) :-).
sparkymat

1
@Richard H Я стверджую, що той, хто використовує такі великі файли XML, що вони не впишуться в оперативну пам'ять, робить щось дуже не так.
antred

1
завантажте величину розміром 40 м, використовуйте пам'ять 200 м при використанні аналізатора SAX, але використовуйте 9 г пам'яті при використанні аналізатора DOM.
zhiyuan_

98

Всього декілька слів ...

SAX ( S implemen A PI для X ML): це потоковий процесор. У вас є лише крихітна частина пам’яті в будь-який час, і ви «нюхаєте» потік XML, застосовуючи код зворотного виклику для таких подій tagStarted()тощо. Він майже не використовує пам'ять, але ви не можете робити «DOM» речі, як-от xpath або траверс дерева.

DOM ( D oument O bject M odel): Ви завантажуєте все в пам’ять - це масивна свиня для пам’яті. Ви можете залишити пам'ять навіть середніми документами. Але ви можете використовувати xpath та об'їжджати дерево тощо.


66

Тут простішими словами:

DOM

  • Аналізатор моделі дерева (на основі об'єкта) (Дерево вузлів).

  • DOM завантажує файл у пам'ять, а потім розбирає файл.

  • Має обмеження в пам'яті, оскільки він завантажує весь XML-файл перед розбором.

  • DOM читається і записується (може вставляти або видаляти вузли).

  • Якщо вміст XML невеликий, то віддайте перевагу аналізатору DOM.

  • Пошук назад і вперед можливий для пошуку тегів та оцінки інформації всередині тегів. Так це дає легкість навігації.

  • Повільніше під час виконання.

SAX

  • Аналізатор подій (послідовність подій).

  • SAX аналізує файл під час його читання, тобто аналізує вузол за вузлом.

  • Жодних обмежень для пам'яті, оскільки це не зберігає вміст XML у пам'яті.

  • SAX читається лише, тобто не може вставити чи видалити вузол.

  • Використовуйте SAX-аналізатор, коли вміст пам'яті великий.

  • SAX читає XML-файл зверху вниз, а навігація назад не можлива.

  • Швидше під час виконання.


Ідеально ... очікував певної відповіді в балах. Гарна робота :)
Kunal Gupta

37

Ви правильно в розумінні моделі на основі DOM. XML-файл буде завантажений в цілому, і весь його вміст буде побудовано як уявлення про дерево, яке документ представляє в пам'яті. Це може зайняти багато часу та пам'яті, залежно від того, наскільки великий вхідний файл. Перевага такого підходу полягає в тому, що ви можете легко запитувати будь-яку частину документа і вільно маніпулювати усіма вузлами дерева.

Підхід DOM зазвичай використовується для невеликих XML-структур (де невелика залежить від того, скільки кінських сил та пам'яті має ваша платформа), які, можливо, потребують модифікації та запиту різними способами після їх завантаження.

SAX, з іншого боку, розроблений для обробки вводу XML практично будь-якого розміру. Замість того, щоб фреймворк XML робив важку роботу для з'ясування структури документа та підготовки потенційно багато об'єктів для всіх вузлів, атрибутів тощо, SAX повністю залишає це вам.

В основному це читати введення зверху та викликати методи зворотного виклику, які ви надаєте, коли відбуваються певні "події". Подія може потрапляти на вступний тег, атрибут у тезі, пошук тексту всередині елемента або наближення до кінцевого тегу.

SAX вперто читає вхід і розповідає, що він бачить таким чином. Вам належить зберігати всю необхідну державну інформацію. Зазвичай це означає, що ви побудуєте якусь державну машину.

Хоча такий підхід до обробки XML набагато складніше, він також може бути дуже потужним. Уявіть, що ви хочете просто витягнути заголовки новин із стрічки блогу. Якщо ви читаєте цю XML за допомогою DOM, вона завантажуватиме в пам'ять весь вміст статті, усі зображення тощо, що містяться в XML, навіть якщо вас це навіть не цікавить.

За допомогою SAX ви можете просто перевірити, чи ім'я елемента є (наприклад) "title" кожного разу, коли викликається ваш метод події "startTag". Якщо це так, ви знаєте, що вам потрібно додати все, що вам запропонує наступна подія "elementText". Коли ви отримуєте виклик події "endTag", ви ще раз перевіряєте, чи це закриваючий елемент "заголовка". Після цього ви просто ігноруєте всі подальші елементи, поки не закінчиться або вхід, або інший "startTag" з назвою "title". І так далі...

Ви можете читати через мегабайти та мегабайти XML таким чином, лише витягуючи мінімальну кількість потрібних даних.

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

Таким чином, в цілому SAX підходить для комбінування через потенційно велику кількість даних, які ви отримуєте з урахуванням конкретного "запиту", але не потребує змін, в той час як DOM більше спрямований на надання вам повної гнучкості в зміні структури та вмісту за рахунок більший попит на ресурси.


16

Ви порівнюєте яблука та груші. SAX - це аналізатор, який аналізує серіалізовані структури DOM. Існує багато різних аналізаторів, і "на основі подій" відноситься до методу розбору.

Можливо, невеликий резюме в порядку:

  • Модель об'єкта документа (DOM) - це абстрактна модель даних, яка описує ієрархічну структуру документа на основі дерева; дерево документів складається з вузлів , а саме вузлів елементів, атрибутів та тексту (та деяких інших). Вузли мають батьків, братів і сестер та дітей, і їх можна пересувати тощо. Усі речі, до яких ви звикли робити JavaScript (що, до речі, не має нічого спільного з DOM).

  • Структура DOM може бути серіалізована , тобто записана у файл, використовуючи мову розмітки, як HTML або XML. Таким чином, HTML або XML-файл містить "виписану" або "сплюснуту" версію абстрактного дерева документів.

  • Щоб комп'ютер маніпулював або навіть відображав дерево DOM з файлу, він повинен десеріалізувати або проаналізувати файл та відновити абстрактне дерево в пам'яті. Ось де відбувається розбір.

Зараз ми переходимо до природи парсерів. Одним із способів розбору було б прочитати весь документ і рекурсивно створити структуру дерева в пам’яті та нарешті викрити весь результат користувачеві. (Я припускаю, що ви можете назвати цих парсерів "парсерами DOM".) Це було б дуже зручно для користувача (я думаю, що це робить XML-аналізатор PHP), але він страждає від проблем зі масштабованістю і стає дуже дорогим для великих документів.

З іншого боку, розбір на основі подій , як це робив SAX, дивиться на файл лінійно і просто здійснює зворотні дзвінки користувачеві кожного разу, коли він стикається з структурними фрагментами даних, наприклад "цей елемент розпочато", "цей елемент закінчився" , "деякий текст тут" і т. д. Це має ту перевагу, що він може тривати назавжди, не турбуючись про розмір вхідного файлу, але це набагато нижчий рівень, оскільки він вимагає від користувача виконати всі фактичні роботи з обробки (надавши зворотній дзвінок). Щоб повернутися до початкового питання, термін "на основі подій" відноситься до тих подій розбору, які аналізатор викликає під час проходження файлу XML.

У статті Вікіпедії є багато деталей про етапи розбору SAX.


11

Я дам загальну відповідь на відповіді на питання та відповіді на це питання:

Відповідь на запитання

Для чого нам потрібен XML-аналізатор?

Нам потрібен XML-аналізатор, тому що ми не хочемо робити все в нашій програмі з нуля, і нам потрібні якісь програми "помічників" або бібліотеки, щоб зробити щось дуже низьке, але дуже необхідне нам. Ці низькі, але необхідні речі включають перевірку чітко сформованої форми, перевірку документа на його DTD або схему (лише для перевірки парсерів), вирішення посилань на символи, розуміння розділів CDATA тощо. XML-аналізатори - саме такі «помічники» програми, і вони будуть виконувати всі ці завдання. За допомогою XML-аналізатора ми захищаємося від багатьох цих складностей, і ми можемо зосередитись на простому програмуванні на високому рівні через API, реалізований парсерами, і таким чином отримати ефективність програмування.

Хто з них кращий, SAX чи DOM?

Як SAX, так і DOM аналізатор мають свої переваги та недоліки. Що краще, має залежати від особливостей вашої заявки (зверніться до деяких питань нижче).

Який парсер може отримати кращу швидкість, DOM або SAX парсери?

SAX-аналізатор може отримати кращу швидкість.

Яка різниця між API на основі дерева та API на основі подій?

API на основі дерев зосереджений навколо структури дерева і тому надає інтерфейси для компонентів дерева (що є документом DOM), таких як інтерфейс документа, інтерфейс вузла, інтерфейс NodeList, інтерфейс елементів, інтерфейс Attr тощо. Натомість API, заснований на подіях, надає інтерфейси для обробників. Є чотири інтерфейси обробника, інтерфейс ContentHandler, інтерфейс DTDHandler, інтерфейс EntityResolver та інтерфейс ErrorHandler.

Яка різниця між аналізатором DOM і SAX парсером?

DOM-парсери та SAX-парсери працюють різними способами:

  • Аналізатор DOM створює структуру дерева в пам'яті з вхідного документа і потім чекає запитів від клієнта. Але SAX-аналізатор не створює жодної внутрішньої структури. Натомість він приймає вхід компонентів вхідного документа як події та повідомляє клієнту, що він читає, читаючи через вхідний документ. А

  • DOM-аналізатор завжди обслуговує клієнтську програму з усім документом, незалежно від того, скільки насправді потрібно клієнту. Але SAX-аналізатор обслуговує клієнтську програму завжди лише з фрагментами документа в будь-який момент.

  • За допомогою аналізатора DOM, виклики методів у клієнтській програмі повинні бути явними та утворювати своєрідну ланцюжок. Але в SAX деякі певні методи (як правило, переосмислені коефіцієнтом) будуть викликатися автоматично (неявно) способом, який називається "зворотним викликом", коли відбуваються певні події. Ці методи не повинні викликати клієнт явно, хоча ми можемо їх чітко викликати.

Як ми вирішуємо, який парсер хороший?

В ідеалі гарний аналізатор повинен бути швидким (економічно ефективним), просторовим, багатим функціоналом і простим у використанні. Але насправді жоден з основних аналізаторів не має всіх цих особливостей одночасно. Наприклад, аналізатор DOM багатий функціоналом (тому що він створює дерево DOM в пам'яті і дозволяє отримувати доступ до будь-якої частини документа неодноразово і дозволяє змінювати дерево DOM), але це неефективний простір, коли документ величезний , і навчитися працювати з цим потрібно небагато часу. Однак, аналізатор SAX значно ефективніше простору у випадку великого вхідного документа (оскільки він не створює внутрішньої структури). Більше того, він працює швидше і його легше вивчити, ніж DOM Parser, оскільки його API справді простий. Але з точки зору функціональності, він надає менше функцій, що означає, що самі користувачі повинні дбати про більше, наприклад створення власних структур даних. До речі, що таке хороший аналізатор? Я думаю, що відповідь дійсно залежить від особливостей вашої заяви.

Які є реальні додатки, коли використання аналізатора SAX вигідніше, ніж використання аналізатора DOM і навпаки? Які звичайні програми для аналізатора DOM і для аналізатора SAX?

У наступних випадках використання аналізатора SAX вигідніше, ніж використання аналізатора DOM.

  • Вхідний документ занадто великий для доступної пам'яті (насправді в цьому випадку SAX - ваш єдиний вибір)
  • Ви можете обробити документ невеликими суміжними фрагментами введення. Вам не потрібен весь документ, перш ніж ви зможете зробити корисну роботу
  • Ви просто хочете використовувати парсер для вилучення цікавої інформації, і всі ваші обчислення будуть повністю засновані на створених вами структурах даних. Насправді в більшості наших додатків ми створюємо власні структури даних, які зазвичай не такі складні, як дерево DOM. З цього сенсу, я думаю, шанс використання аналізатора DOM менший, ніж шанс використання аналізатора SAX.

У наступних випадках використання аналізатора DOM вигідніше, ніж використання аналізатора SAX.

  • У вашій програмі потрібно одночасно отримувати доступ до широко відокремлених частин документа.
  • Ваша програма, можливо, може використовувати внутрішню структуру даних, яка майже така ж складна, як і сам документ.
  • Ваша заявка повинна неодноразово змінювати документ.
  • Ваша програма повинна зберігати документ протягом значної кількості часу через багато дзвінків методів.

Приклад (Використовувати аналізатор DOM або аналізатор SAX?):

Припустимо, що у викладача є XML-документ, який містить усю особисту інформацію учнів, а також бали, які його студенти склали у своєму класі, і він тепер присвоює випускні оцінки студентам за допомогою програми. Що він хоче скласти, - це список із SSN та оцінками. Також ми припускаємо, що у своїй заяві інструктор не використовує такої структури даних, як масиви для зберігання особистої інформації студента та балів. Якщо викладач вирішить дати А тим, хто заробив середній клас або вище, а В дасть іншим, тоді він краще використовувати аналізатор DOM у своїй заявці. Причина полягає в тому, що він не може знати, скільки коштує середнє число класів, перш ніж весь документ буде оброблений. Що він, мабуть, повинен зробити у своїй заявці, спочатку перегляне всі студенти балів і обчисліть середнє, а потім ще раз перегляньте документ і призначте підсумкову оцінку кожному студенту, порівнявши отримані ним бали із середнім класом. Якщо, однак, викладач прийме таку політику оцінювання, що студентам, які отримали 90 балів або більше, присвоюється А, а іншим присвоєно B, тоді, ймовірно, він краще використовувати аналізатор SAX. Причина полягає в тому, щоб призначити кожному студенту підсумкову оцінку, йому не потрібно чекати, коли весь документ буде оброблений. Він міг одразу призначити студенту оцінку, як тільки SAX-аналізатор прочитає оцінку цього студента. У наведеному вище аналізі ми припускали, що інструктор не створив власної структури даних. Що робити, якщо він створить власну структуру даних, наприклад масив рядків для зберігання SSN та масив цілих чисел для зберігання точок? В цьому випадку, Я думаю, що SAX - кращий вибір, перш ніж це могло б заощадити і пам’ять, і час, але все ж таки виконати роботу. Ну і ще один розгляд на цьому прикладі. Що робити, якщо викладач хоче зробити це не надрукувати список, а зберегти назад оригінальний документ із оновленою оцінкою кожного студента? У цьому випадку аналізатор DOM повинен бути кращим вибором незалежно від того, яку політику оцінювання він проводить. Йому не потрібно створювати будь-які власні структури даних. Що йому потрібно зробити, це спершу змінити дерево DOM (тобто встановити значення вузла 'grade'), а потім зберегти все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг виконати роботу. все-таки приступайте до роботи. Ну і ще один розгляд на цьому прикладі. Що робити, якщо викладач хоче зробити це не надрукувати список, а зберегти назад оригінальний документ із оновленою оцінкою кожного студента? У цьому випадку аналізатор DOM повинен бути кращим вибором незалежно від того, яку політику оцінювання він проводить. Йому не потрібно створювати будь-які власні структури даних. Що йому потрібно зробити, це спершу змінити дерево DOM (тобто встановити значення вузла 'grade'), а потім зберегти все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг виконати роботу. все-таки приступайте до роботи. Ну і ще один розгляд на цьому прикладі. Що робити, якщо викладач хоче зробити це не надрукувати список, а зберегти назад оригінальний документ із оновленою оцінкою кожного студента? У цьому випадку аналізатор DOM повинен бути кращим вибором незалежно від того, яку політику оцінювання він проводить. Йому не потрібно створювати будь-які власні структури даних. Що йому потрібно зробити, це спершу змінити дерево DOM (тобто встановити значення вузла 'grade'), а потім зберегти все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг виконати роботу. але зберегти оригінальний документ назад із оновленою оцінкою кожного учня? У цьому випадку аналізатор DOM повинен бути кращим вибором незалежно від того, яку політику оцінювання він проводить. Йому не потрібно створювати будь-які власні структури даних. Що йому потрібно зробити, це спершу змінити дерево DOM (тобто встановити значення вузла 'grade'), а потім зберегти все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг виконати роботу. але зберегти оригінальний документ назад із оновленою оцінкою кожного учня? У цьому випадку аналізатор DOM повинен бути кращим вибором незалежно від того, яку політику оцінювання він проводить. Йому не потрібно створювати будь-які власні структури даних. Що йому потрібно зробити, це спершу змінити дерево DOM (тобто встановити значення вузла 'grade'), а потім зберегти все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг виконати роботу. вузол), а потім збережіть все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг виконати роботу. вузол), а потім збережіть все модифіковане дерево. Якщо він вирішить використовувати аналізатор SAX замість аналізатора DOM, то в цьому випадку він повинен створити структуру даних, яка майже така ж складна, як дерево DOM, перш ніж він міг би виконати роботу.

Приклад

Постановка проблеми : Напишіть програму Java, щоб витягти всю інформацію про кола, які є елементами в даному документі XML. Ми припускаємо, що кожен елемент кола має три дочірні елементи (тобто x, y і радіус), а також атрибут кольору. Зразок документа наведено нижче:

<?xml version="1.0"?> 
<!DOCTYPE shapes [
<!ELEMENT shapes (circle)*>
<!ELEMENT circle (x,y,radius)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>
<!ELEMENT radius (#PCDATA)>
<!ATTLIST circle color CDATA #IMPLIED>
]>

<shapes> 
          <circle color="BLUE"> 
                <x>20</x>
                <y>20</y>
                <radius>20</radius> 
          </circle>
          <circle color="RED" >
                <x>40</x>
                <y>40</y>
                <radius>20</radius> 
          </circle>
</shapes> 

Програма з DOMparser

import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;


public class shapes_DOM {
   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers  
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles 

   public static void main(String[] args) {   

      try{
         // create a DOMParser
         DOMParser parser=new DOMParser();
         parser.parse(args[0]);

         // get the DOM Document object
         Document doc=parser.getDocument();

         // get all the circle nodes
         NodeList nodelist = doc.getElementsByTagName("circle");
         numberOfCircles =  nodelist.getLength();

         // retrieve all info about the circles
         for(int i=0; i<nodelist.getLength(); i++) {

            // get one circle node
            Node node = nodelist.item(i);

            // get the color attribute 
            NamedNodeMap attrs = node.getAttributes();
            if(attrs.getLength() > 0)
               color[i]=(String)attrs.getNamedItem("color").getNodeValue();

            // get the child nodes of a circle node 
            NodeList childnodelist = node.getChildNodes();

            // get the x and y value 
            for(int j=0; j<childnodelist.getLength(); j++) {
               Node childnode = childnodelist.item(j);
               Node textnode = childnode.getFirstChild();//the only text node
               String childnodename=childnode.getNodeName(); 
               if(childnodename.equals("x")) 
                  x[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("y")) 
                  y[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("radius")) 
                  r[i]= Integer.parseInt(textnode.getNodeValue().trim());
            }

         }

         // print the result
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }

      }  catch (Exception e) {e.printStackTrace(System.err);}

    }

}

Програма з SAXparser

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.xerces.parsers.SAXParser;


public class shapes_SAX extends DefaultHandler {

   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles

   static int flagX=0;    //to remember what element has occurred
   static int flagY=0;    //to remember what element has occurred
   static int flagR=0;    //to remember what element has occurred

   // main method 
   public static void main(String[] args) {   
      try{
         shapes_SAX SAXHandler = new shapes_SAX (); // an instance of this class
         SAXParser parser=new SAXParser();          // create a SAXParser object 
         parser.setContentHandler(SAXHandler);      // register with the ContentHandler 
         parser.parse(args[0]);
      }  catch (Exception e) {e.printStackTrace(System.err);}  // catch exeptions
   }

   // override the startElement() method
   public void startElement(String uri, String localName, 
                       String rawName, Attributes attributes) {
         if(rawName.equals("circle"))                      // if a circle element is seen
            color[numberOfCircles]=attributes.getValue("color");  // get the color attribute 

         else if(rawName.equals("x"))      // if a x element is seen set the flag as 1 
            flagX=1;
         else if(rawName.equals("y"))      // if a y element is seen set the flag as 2
            flagY=1;
         else if(rawName.equals("radius")) // if a radius element is seen set the flag as 3 
            flagR=1;
   }

   // override the endElement() method
   public void endElement(String uri, String localName, String rawName) {
         // in this example we do not need to do anything else here
         if(rawName.equals("circle"))                       // if a circle element is ended 
            numberOfCircles +=  1;                          // increment the counter 
   }

   // override the characters() method
   public void characters(char characters[], int start, int length) {
         String characterData = 
             (new String(characters,start,length)).trim(); // get the text

         if(flagX==1) {        // indicate this text is for <x> element 
             x[numberOfCircles] = Integer.parseInt(characterData);
             flagX=0;
         }
         else if(flagY==1) {  // indicate this text is for <y> element 
             y[numberOfCircles] = Integer.parseInt(characterData);
             flagY=0;
         }
         else if(flagR==1) {  // indicate this text is for <radius> element 
             r[numberOfCircles] = Integer.parseInt(characterData);
             flagR=0;
         }
   }

   // override the endDocument() method
   public void endDocument() {
         // when the end of document is seen, just print the circle info 
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }
   }


}

6

На практиці: book.xml

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>
  • DOM представляє документ xml як наступну структуру дерева в пам'яті.
  • DOM стандарт W3C.
  • Аналізатор DOM працює над моделлю об'єктного документа.
  • DOM займає більше пам’яті, бажано для невеликих XML-документів
  • DOM легко переміщуватися вперед або назад.

введіть тут опис зображення


  • SAX представляє документ XML як події на основі як start element:abc, end element:abc.
  • SAX не стандарт W3C, його розробили групи розробників.
  • SAX не використовує пам'ять, бажану для великих XML-документів.
  • Навігація назад не можлива, оскільки вона послідовно обробляє документи.
  • Подія відбувається з вузлом / елементом, і він дає всі підвузли (латинський nodus, 'вузол').

Цей XML-документ при передачі через аналізатор SAX генерує послідовність подій, таких як :

start element: bookstore
start element: book with an attribute category equal to cooking
start element: title with an attribute lang equal to en
Text node, with data equal to Everyday Italian
....
end element: title
.....
end element: book
end element: bookstore

чому attr: "lang"вище element: <title>у візуальному поданні розбору DOM? Дивлячись на XML, схоже, що параметр attrповинен бути паралельним його <element>як з <book>і category. Це просто техніка економії місця або призначені стосунки батько-дитина?
1252748

це просто техніка економії місця
Премрай

3

DOM стоїть для моделі об'єкта документа і він представляє XML-документ у форматі дерева, кожен елемент якого представляє гілки дерев. DOM Parser створює в дереві пам'яті XML-файл, а потім аналізує його, тому йому потрібно більше пам’яті і бажано збільшити розмір купи для аналізатора DOM, щоб уникнути простору купівлі Java.lang.OutOfMemoryError: Java. Розбір XML-файлу за допомогою аналізатора DOM досить швидкий, якщо XML-файл невеликий, але якщо ви спробуєте прочитати великий XML-файл за допомогою аналізатора DOM, є більше шансів, що це займе багато часу або навіть не зможе завантажити його повністю просто тому, що для створення XML Dom Tree потрібно багато пам'яті. Java забезпечує підтримку DOM Parsing, і ви можете розбирати XML-файли в Java за допомогою аналізатора DOM. Класи DOM знаходяться в пакеті w3c.dom, в той час як DOM Parser для Java знаходиться в пакеті JAXP (Java API для XML Parsing).

SAX XML-аналізатор на Java

SAX Стенди простого API для аналізу XML. Це XML Parsing на основі події, і він аналізує XML-файл поетапно, настільки підходить для великих XML-файлів. SAX XML Parser запускає подію, коли він наштовхується на тег, елемент або атрибут відкриття, і розбір працює відповідно. Рекомендується використовувати аналізатор SAX XML для розбору великих файлів XML на Java, оскільки він не потребує завантаження на Java цілого XML-файлу, і він може читати великий XML-файл невеликими частинами. Java надає підтримку аналізатора SAX, і ви можете проаналізувати будь-який XML-файл на Java за допомогою SAX Parser, я наводив приклад читання файлу xml за допомогою SAX Parser тут. Одним недоліком використання SAX Parser в Java є те, що для читання XML-файлу на Java за допомогою SAX Parser потрібно більше коду порівняно з DOM Parser.

Різниця між DOM і SAX XML Parser

Ось кілька різниць високого рівня між аналізатором DOM і SAX Parser на Java:

1) DOM-аналізатор завантажує в пам'ять цілий XML-документ, тоді як SAX завантажує в пам'ять лише невелику частину XML-файлу.

2) Аналізатор DOM швидше, ніж SAX, оскільки він отримує доступ до всього XML-документа в пам'яті.

3) SAX-аналізатор на Java краще підходить для великих XML-файлів, ніж DOM Parser, оскільки для нього не потрібно багато пам'яті.

4) DOM-аналізатор працює над об'єктною моделлю документа, в той час як SAX є XML-аналізатором на основі події.

Детальніше: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ


2

І SAX, і DOM використовуються для розбору документа XML. Обидва мають переваги та недоліки і можуть використовуватися в нашому програмуванні залежно від ситуації

SAX:

  1. Розбирає вузол за вузлом

  2. Не зберігає XML в пам'яті

  3. Ми не можемо вставити або видалити вузол

  4. Перехід від верху до низу

DOM

  1. Зберігає весь XML-документ у пам'яті перед обробкою

  2. Займає більше пам’яті

  3. Ми можемо вставити або видалити вузли

  4. Проїжджайте в будь-якому напрямку.

Якщо нам потрібно знайти вузол і не потрібно вставляти чи видаляти, ми можемо перейти із самим SAX, інакше DOM за умови, що у нас є більше пам’яті.


1

1) DOM-аналізатор завантажує в пам'ять весь XML-документ, тоді як SAX завантажує в пам'ять лише невелику частину файлу XML.

2) Аналізатор DOM швидше, ніж SAX, оскільки він отримує доступ до всього XML-документа в пам'яті.

3) SAX-аналізатор на Java краще підходить для великих XML-файлів, ніж DOM Parser, оскільки для нього не потрібно багато пам'яті.

4) Аналізатор DOM працює над об'єктною моделлю документа, в той час як SAX є XML-аналізатором на основі подій.

Детальніше: http://javarevisited.blogspot.com/2011/12/difference-between-dom-and-sax-parsers.html#ixzz498y3vPFR

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.