SAX против XmlTextReader - SAX в C#

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

XmlTextReader устарел для прямого использования. Его следует использовать только при создании собственного класса XmlReader, производного от XmlTextReader. Вместо этого следует использовать XmlReader.Create.

John Saunders 13.08.2009 14:41

@John: У вас нет источника доказательств, пожалуйста?

abatishchev 18.01.2012 11:58

См. «Примечания» на странице XmlTextReader класс: «Примечание. В выпуске .NET Framework версии 2.0 рекомендуется создавать экземпляры XmlReader с помощью метода XmlReader.Create. Это позволяет в полной мере использовать новые функции, представленные в этом выпуске. Для получения дополнительной информации см. Создание читателей XML ".

John Saunders 18.01.2012 17:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
3
12 791
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Хм, согласно этой странице, SAX является стандартом де-факто в отрасли (только не в мире Microsoft): xml.org/xml-dev

EnocNRoll - AnandaGopal Pardue 13.02.2009 17:57

О, возможно, стоит отметить, что официальная реализация SAX из Java является табличной и не подвергалась изменениям даже дольше, чем SAX для .NET. Единственный раз, когда потребуются улучшения любой кодовой базы, это в основном, если стандарт XML будет развиваться дальше.

EnocNRoll - AnandaGopal Pardue 13.02.2009 18:02

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

  1. SAX - это модель «проталкивания», а XmlReader - анализатор опрашивания с ряд преимуществ.
  2. Зависимость от сторонней библиотеки вместо использования стандартного .NET API.

Значит, XmlReader похож на StAX?

stephanmg 29.01.2020 04:19

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

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

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

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

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

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

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

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

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

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

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

Ваше мнение, похоже, основано на том факте, что вы кое-что узнали о XmlReader на собственном горьком опыте. Это лучший способ составить мнение по техническим вопросам?

John Saunders 13.08.2009 14:40

Джон, я полагаю, ты прав, и я прошу прощения. Хотя я считаю, что XmlReader является причиной множества странных ошибок в программном обеспечении, которых можно было бы избежать с помощью простого подхода, основанного на SAX.

Brett Ryan 20.08.2009 14:29

Я согласен с Бреттом. XmlTextReader загадочен и перегружен множеством способов сделать почти одно и то же. Кроме того, его модель поощряет очень точное определение вашей принятой структуры Xml. Хотя это удобно для некоторых приложений, в большинстве своих я хочу отклонить код, который не соответствует моей предполагаемой структуре. Что мне действительно нужно, так это библиотека RDP xml, и я очень удивлен, что никто ее не написал. Однако без этого я предпочитаю SAX.

user430788 31.03.2012 01:42

Другие вопросы по теме