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

SAX vs XmlTextReader - SAX в С#

Я пытаюсь прочитать большой XML-документ, и я хотел сделать это в кусках vs XmlDocument, чтобы прочитать весь файл в памяти. Я знаю, что могу использовать XmlTextReader для этого, но мне было интересно, если кто-то использовал SAX для .NET? Я знаю, что разработчики Java клянутся этим, и мне было интересно, стоит ли попробовать попробовать, и если да, то в чем преимущества его использования. Я ищу специфику.

4b9b3361

Ответ 1

Если вы говорите о SAX для .NET, проект, похоже, не поддерживается. Последний выпуск был более 2 лет назад. Может быть, они отлично справились с последним выпуском, но я бы не стал спорить об этом. Автор, Карл Ваклавек, кажется, исчез из сети.

Что касается SAX под Java? Вы держите пари, это здорово. К сожалению, SAX никогда не разрабатывался как стандарт, поэтому все порты, отличные от Java, адаптировали Java API для своих нужд. Хотя DOM - довольно скверный API, он имеет то преимущество, что был разработан для нескольких языков и сред, поэтому его легко реализовать в Java, С#, JavaScript, C и др.

Ответ 2

Если вы просто хотите быстро выполнить задание, для этой цели существует XmlTextReader (в .NET).

Если вы хотите изучить стандарт де-факто (и доступный в других языках программирования), который будет стабильным и который заставит вас кодировать очень эффективно и элегантно, но который также является чрезвычайно гибким, а затем зайдите в SAX. Однако не тратьте свое время, если вы не собираетесь создавать эзотерические синтаксические анализаторы XML. Вместо этого найдите парсеров, которые синтаксические анализаторы следующего поколения (например, XmlTextReader) для вашей конкретной платформы.

Ресурсы SAX
SAX был первоначально написан для Java, и вы можете найти оригинальный проект с открытым исходным кодом, который был стабильным в течение нескольких лет: http://sax.sourceforge.net/

Здесь есть порт С# того же проекта (с документами HTML как часть загрузки исходного кода); он также стабилен: http://saxdotnet.sourceforge.net/

Если вам не нравится реализация С#, вы всегда можете прибегать к ссылке на COM-библиотеки DLL через COMInterop с помощью MSXML3 или более поздней версии: http://msdn.microsoft.com/en-us/library/ms994343.aspx

Статьи, которые поступают из мира Java, но которые, вероятно, иллюстрируют концепции, которые вам нужны для успеха с этим подходом (может быть также загружаемый исходный код Java, который может оказаться полезным и может быть достаточно простым для преобразования в С#):

Это будет громоздкая реализация. Я использовал SAX только в свои пред-.NET-дни, но для этого требуются некоторые довольно продвинутые методы кодирования. На данный момент это просто не стоит проблем.

Интересная концепция гибридного анализатора
Этот поток описывает гибридный синтаксический анализатор, который использует .NET XmlTextReader для реализации парсера, который обеспечивает комбинацию преимуществ DOM и SAX...
http://bytes.com/groups/net-xml/178403-xmltextreader-versus-dom

Ответ 3

Я считаю, что нет никаких преимуществ при использовании SAX по крайней мере по двум причинам:

  • SAX - это модель "push", в то время как XmlReader - это анализатор тяги, который дает ряд преимуществ.
  • Зависит от сторонней библиотеки, а не от стандартного .NET API.

Ответ 4

Лично я предпочитаю SAX-модель, поскольку XmlReader имеет некоторые действительно раздражающие ловушки, которые могут вызвать ошибки в вашем коде, что может привести к тому, что ваш код пропускает элементы. Большинство кода будут структурированы примерно за время (rdr.Read()), но если у вас есть какой-либо "ReadString" или "ReadInnerXml()" в этом цикле, вы обнаружите, что пропустите элементы на следующей итерации.

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

Мое личное мнение заключается в том, что Microsoft придумала идею о том, что XmlReader лучше объясняет модель push/pull, но я ее действительно не покупаю. Поэтому Microsoft считает, что вам не нужно создавать государственную машину с XmlReader, что для меня не имеет смысла, но в любом случае это просто мое мнение.