SAX vs XmlTextReader - C#中的SAX

时间:2008-09-24 15:26:44

标签: c# java xml sax

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

4 个答案:

答案 0 :(得分:9)

如果您只是想快速完成工作,那么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

答案 1 :(得分:7)

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

Java下的SAX?你打赌,这很棒。遗憾的是,SAX从未作为标准开发,因此所有非Java端口都根据自己的需要调整了Java API。虽然DOM是一个非常糟糕的API,但它具有针对多种语言和环境而设计的优势,因此可以很容易地在Java,C#,JavaScript,C等中实现。

答案 2 :(得分:5)

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

  1. SAX是一个“推送”模型,而XmlReader是一个具有a number of benefits的拉解析器。
  2. 依赖第三方库而不是使用标准.NET API。

答案 3 :(得分:5)

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

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

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