我正在尝试读取一个大型 XML 文档,并且我想以块 vsXmlDocument
的方式将整个文件读入内存。我知道我可以XmlTextReader
这样做,但我想知道是否有人使用过 SAX for .NET?我知道 Java 开发人员对此深信不疑,我想知道是否值得一试,如果值得一试,使用它有什么好处。我正在寻找细节。
4 回答
如果您只想快速完成工作,那么 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#):
- 输出大型 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 与 dom
如果您在谈论SAX for .NET,则该项目似乎没有得到维护。上一次发布是在 2 年前。也许他们在上一个版本中做到了完美,但我不会打赌。作者 Karl Waclawek 似乎已经从网上消失了。
至于Java下的SAX?你敢打赌,这很棒。不幸的是,SAX 从未作为标准开发,因此所有非 Java 端口都在根据自己的需要调整 Java API。虽然 DOM 是一个非常糟糕的 API,但它的优点是针对多种语言和环境设计,因此很容易在 Java、C#、JavaScript、C 等中实现。
我相信使用 SAX 没有任何好处,至少有两个原因:
- SAX 是“推”模型,而 XmlReader 是具有许多优点的拉解析器。
- 依赖于第 3 方库而不是使用标准的 .NET API。
就个人而言,我更喜欢 SAX 模型,因为 XmlReader 有一些非常烦人的陷阱,这些陷阱可能会导致代码中的错误,从而可能导致代码跳过元素。大多数代码将围绕 while(rdr.Read()) 模型构建,但如果您在该循环中有任何“ReadString”或“ReadInnerXml()”,您会发现自己在下一次迭代中跳过了元素。
由于 SAX 是基于事件的,因此这永远不会发生,因为您无法执行任何会导致解析器提前搜索的操作。
我个人的感觉是,微软已经发明了 XmlReader 更好地解释推/拉模型的概念,但我并不真正相信它。所以微软认为你不需要用 XmlReader 创建状态机,这对我来说没有意义,但无论如何,这只是我的意见。