Вопрос

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

Это было полезно?

Решение

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

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

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

Если вы просто хотите быстро выполнить работу, для этой цели существует 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 не дает никаких преимуществ по крайней мере по двум причинам:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top