SAX与XmlTextReader-C#中的SAX

时间:2020-03-06 14:40:12  来源:igfitidea点击:

我试图读取一个大的XML文档,我想以大块的方式来完成它,而XmlDocument是将整个文件读入内存的方式。我知道我可以使用XmlTextReader来做到这一点,但是我想知道是否有人使用过.NET的SAX?我知道Java开发人员对此很满意,我想知道是否值得尝试一下,如果可以的话使用它有什么好处。我正在寻找细节。

解决方案

如果我们正在谈论.NET的SAX,则该项目似乎没有得到维护。最新版本是2年前。也许他们在上一个版本中做到了完美,但是我不会打赌。作者Karl Waclawek似乎已经从网络上消失了。

至于Java下的SAX?我们打赌,这很好。不幸的是,SAX从未被开发为标准,因此所有非Java端口都一直在根据自己的需求改编Java API。尽管DOM是一个非常糟糕的API,但它具有针对多种语言和环境进行设计的优势,因此可以轻松地用Java,C#,JavaScript,C等实现。

我认为使用SAX至少没有两个原因,因此没有任何好处:

  • SAX是"推"模型,而XmlReader是拉分析器​​,它具有许多优点。
  • 依赖于第三方库而不是使用标准的.NET API。

如果我们只是想快速完成工作,则可以使用XmlTextReader来实现此目的(在.NET中)。

如果我们想学习一个稳定的事实标准(可以在其他编程语言中使用),它会迫使我们非常高效,优雅地进行编码,但是又非常灵活,那么可以考虑使用SAX。但是,除非我们要创建高度深奥的XML解析器,否则请不要浪费时间。相反,请为特定平台寻找下一代解析器(例如XmlTextReader)所使用的解析器。

SAX资源
SAX最初是为Java编写的,我们可以在以下位置找到原始的开源项目,该项目已经稳定了好几年:
http://sax.sourceforge.net/

这里有一个相同项目的Cport(HTML文档是源代码下载的一部分)。它也是稳定的:
http://saxdotnet.sourceforge.net/

如果我们不喜欢该实现,则可以始终使用MSXML3或者更高版本通过COMInterop引用COM DLL:http://msdn.microsoft.com/zh-cn/library/ms994343.aspx

来自Java世界的文章,但可能说明了使用此方法成功所需的概念(也可能有可下载的Java源代码,它们可能被证明有用,并且可能很容易转换为C#):

  • 输出大型XML文档,第1部分(http://www.ibm.com/developerworks/xml/library/x-tipbigdoc.html)
  • 输出大型XML文档,第2部分(http://www.ibm.com/developerworks/xml/library/x-tipbigdoc2.html)
  • 使用SAX过滤器来处理数据(http://www.ibm.com/developerworks/xml/library/x-tipsaxfilter/)

这将是一个繁琐的实现。在.NET以前的日子里,我只使用过SAX,但是它需要一些相当高级的编码技术。在这一点上,这是不值得的麻烦。

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

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

由于SAX是基于事件的,因此它将永远不会停止,因为我们无法执行任何会导致解析器提前查找的操作。

我个人的感觉是,Microsoft发明了XmlReader更好的概念,可以解释为推/拉模型,但我并不是真的购买它。因此,Microsoft认为我们不需要使用XmlReader创建状态机,这对我来说没有意义,但是无论如何,这只是我的观点。