Я пытаюсь прочитать большой XML-документ, и я хотел сделать это по частям, в отличие от способа XmlDocument для чтения всего файла в память. Я знаю, что могу использовать XmlTextReader для этого, но мне было интересно, использовал ли кто-нибудь SAX для .NET? Я знаю, что разработчики Java клянутся этим, и мне было интересно, стоит ли попробовать, и если да, то каковы преимущества его использования. Ищу конкретику.
@John: У вас нет источника доказательств, пожалуйста?
См. «Примечания» на странице XmlTextReader класс: «Примечание. В выпуске .NET Framework версии 2.0 рекомендуется создавать экземпляры XmlReader с помощью метода XmlReader.Create. Это позволяет в полной мере использовать новые функции, представленные в этом выпуске. Для получения дополнительной информации см. Создание читателей XML ".





Если вы говорите о SAX для .NET, похоже, что проект не поддерживается. Последний выпуск был более 2 лет назад. Может быть, они сделали это идеально на последнем выпуске, но я бы не стал на это ставить. Автор, Карл Вацлавек, похоже, исчез из сети.
Что касается SAX под Java? Готов поспорить, это здорово. К сожалению, SAX никогда не разрабатывался как стандарт, поэтому все порты, отличные от Java, адаптировали Java API для своих нужд. Хотя DOM - довольно паршивый API, он имеет то преимущество, что он был разработан для нескольких языков и сред, поэтому его легко реализовать на Java, C#, JavaScript, C и др.
Хм, согласно этой странице, SAX является стандартом де-факто в отрасли (только не в мире Microsoft): xml.org/xml-dev
О, возможно, стоит отметить, что официальная реализация SAX из Java является табличной и не подвергалась изменениям даже дольше, чем SAX для .NET. Единственный раз, когда потребуются улучшения любой кодовой базы, это в основном, если стандарт XML будет развиваться дальше.
Я считаю, что использование SAX не приносит никаких преимуществ, по крайней мере, по двум причинам:
Значит, XmlReader похож на StAX?
Если вы просто хотите быстро выполнить работу, для этой цели существует 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 на собственном горьком опыте. Это лучший способ составить мнение по техническим вопросам?
Джон, я полагаю, ты прав, и я прошу прощения. Хотя я считаю, что XmlReader является причиной множества странных ошибок в программном обеспечении, которых можно было бы избежать с помощью простого подхода, основанного на SAX.
Я согласен с Бреттом. XmlTextReader загадочен и перегружен множеством способов сделать почти одно и то же. Кроме того, его модель поощряет очень точное определение вашей принятой структуры Xml. Хотя это удобно для некоторых приложений, в большинстве своих я хочу отклонить код, который не соответствует моей предполагаемой структуре. Что мне действительно нужно, так это библиотека RDP xml, и я очень удивлен, что никто ее не написал. Однако без этого я предпочитаю SAX.
XmlTextReaderустарел для прямого использования. Его следует использовать только при создании собственного классаXmlReader, производного отXmlTextReader. Вместо этого следует использоватьXmlReader.Create.