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

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

12 голосов
/ 24 сентября 2008

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

Ответы [ 4 ]

9 голосов
/ 13 февраля 2009

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

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

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

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

Если вам не нравится реализация C #, вы всегда можете обратиться к ссылкам на библиотеки DLL COM через 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

7 голосов
/ 24 сентября 2008

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

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

5 голосов
/ 13 августа 2009

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

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

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

5 голосов
/ 25 сентября 2008

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

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