SAX与XmlTextReader – C#中的SAX

我正在尝试阅读一个大型XML文档,我希望以块的forms与XmlDocument将整个文件读入内存的方式进行。 我知道我可以使用XmlTextReader来做到这一点,但我想知道是否有人使用过SAX for .NET? 我知道Java开发人员发誓它,我想知道是否值得试一试,如果是这样,使用它有什么好处。 我正在寻找细节。

如果您正在谈论SAX for .NET ,则该项目似乎不会被维护。 最后一次发布是在两年多前发布的。 也许他们在最后一个版本中得到了完美,但我不会赌它。 作者Karl Waclawek似乎已经从网上消失了。

至于Java下的SAX? 你打赌,这很棒。 不幸的是,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#实现,你总是可以使用MSXML3或更高版本通过COMInterop引用COM DLL: http : //msdn.microsoft.com/en-us/library/ms994343.aspx

来自Java世界的文章,但可能说明了使用这种方法需要成功的概念(可能还有可下载的Java源代码可能很有用,可能很容易转换为C#):

这将是一个繁琐的实施。 在我之前的.NET时代,我只使用过SAX,但它需要一些非常先进的编码技术。 在这一点上,这不值得麻烦。

混合分析器的有趣概念
该线程描述了一个混合解析器,它使用.NET XmlTextReader来实现一个解析器,它提供了DOM和SAX优点的组合……
http://bytes.com/groups/net-xml/178403-xmltextreader-versus-dom

我相信使用SAX没有任何好处,至少有两个原因:

  1. SAX是一种“推送”模型,而XmlReader是一种具有许多优点的拉解析器。
  2. 依赖于第三方库而不是使用标准.NET API。

就个人而言,我更喜欢SAX模型,因为XmlReader有一些非常烦人的陷阱,可能会导致代码中的错误,可能导致代码跳过元素。 大多数代码都是围绕一段时间(rdr.Read())模型构建的,但如果你在该循环中有任何“ReadString”或“ReadInnerXml()”,你会发现自己在下一次迭代中跳过元素。

由于SAX是基于事件的,因此您将无法执行任何会导致解析器提前搜索的操作。

我个人的感觉是,微软已经发明了XmlReader在推/拉模型的解释方面更好的概念,但我并没有真正购买它。 所以微软认为你不需要用XmlReader创建一个状态机,这对我来说没有意义,但无论如何,这只是我的看法。