2014-12-07 4 views
0

Я смотрю на Википедии статью о SAX (Simple API for XML) и я немного озадачен этим недостатком SAX синтаксического анализа: (что явно не хватает цитата)Есть ли способ в Java для проверки XSD без SAX?

Практически любой вид валидации XML требует доступа к документу в полном объеме.

Мне кажется, что трудно поверить - например, объект javax.xml.validation.Validator бросает исключения SAX по всему месту.

Есть ли способ проверить соответствие XSD в Java без использования синтаксического анализатора SAX? Если нет, можете ли вы проверить XML-документ на Java без использования анализатора SAX - возможно, используя что-то другое, кроме XSD?

ответ

1

Не верьте всему, что вы читаете в Википедии. Далее говорится, что для проверки IDREFS вам (очевидно) необходимо поддерживать набор всех идентификаторов в документе. Это не значит, что весь документ должен быть в памяти.

-1

У вас, кажется, ложное противоречие в вашем вопросе. Рассмотрим эту цитату, которую вы цитируете:

Практически любая проверка XML требует доступа к документу в полном объеме.

Вы говорите:

Я нахожу, что трудно поверить ...

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

И тогда вы спросите:

Есть ли способ, чтобы проверить против XSD в Java без использования SAX парсер?

Либо это две несвязанные вещи, либо я не вижу противоречия. Как проверить ... без использования синтаксического анализатора SAX, связанного с проверить без полного документа в памяти? Анализаторы SAX часто используются для синтаксического анализа XML низкого уровня, после чего создается полный документ DOM на основе событий SAX. Я не вижу смысла избегать анализатора SAX, зачем вам?


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

Здесь есть два аспекта: теоретические и практические.

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

Я думаю (но не уверен на 100%), что могут быть случаи, когда вам нужно сохранить весь (или почти весь документ) в памяти.Например, с XSD 1.1. альтернативы Я могу представить себе случай, когда действительность первого элемента N-1 зависит от последнего N-го подэлемента. Возможно, вам нужно сохранить все N в памяти.

Или этот случай с ID/IDREF. Я согласен с Майклом Кей, на самом деле достаточно только сохранить идентификаторы, но эти идентификаторы могут составлять (почти) весь документ в маргинальном случае.

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

+0

Ложное противоречие проистекает из беспорядка статьи из Википедии: статья посвящена SAX, и эта фраза взята из раздела под названием «Недостатки». Как я вижу это, статья подразумевает, что для всей проверки требуется документ полностью, но SAX не обрабатывает документ полностью, поэтому SAX является неэффективным инструментом для проверки. Однако это противоречит широко распространенному использованию для проверки XSD - это противоречие, которое я пытаюсь решить. –

+0

@RichardJPLeGuen Широкое использование SAX для проверки XSD? В самом деле? Любой источник для этого? SAX обычно используется только для синтаксического анализа XML с низким уровнем среднего уровня. Затем создается и проверяется некоторая модель документа. Я никогда не слышал о проверке SAX-only XSD. – lexicore

+0

Прошло два года, но в то время я работал с некоторыми материалами XSD и продолжал искать себя в SAX. И из вопроса - «например, [javax.xml.validation.Validator] (https: // docs .oracle.com/javase/7/docs/api/javax/xml/validation/Validator.html) исключает исключения SAX по всему месту. " –

0

Практически любой вид проверки XML требует полного доступа к документу .

Суть SAX заключается в том, что взаимодействие между вызывающим и библиотекой SAX основано на обратных вызовах, которым управляют при разборе событий. (Напротив, сущность анализа на основе DOM заключается в том, что полное представление документа построено в памяти, и вызывающий может затем изучить его с помощью вызовов библиотеки DOM.)

Проверка парсеров, таких как SAX-based вы заметили, что в Java хорошо берут на себя бремя сохранения состояния, необходимого для проверки XML в отношении схемы. Заявление Википедии, которое вы цитируете, действительно несколько запутанно в этом контексте. Чтобы понять его намерение, представьте, что вы, как программист-программист, имеете дополнительные тесты для выполнения, которые требуют большего количества состояний, чем для каждого обратного вызова. (Это может быть не полностью «документ», но, скорее всего, он будет больше, чем представлен в одном обратном вызове SAX.) Да, проверка работы парсера SAX, но они должны сохранить дополнительное состояние для проверки. Вам, как программисту-программисту, также, возможно, придется сохранить дополнительное состояние для применения ваших дополнительных тестов уровня приложения, а - это дополнительная работа по поддержанию этого состояния, которое автор Википедии намерен передать с цитируемым заявлением.

Смежные вопросы