【发布时间】:2013-10-21 05:04:09
【问题描述】:
我想知道使用 XmlReader 以惯用的函数式样式读取 XML 会是什么样子。即应该如何对待 XmlReader 作为有状态实体。有好的例子吗?
【问题讨论】:
-
有一个 XML 类型提供程序(这里:fsharp.github.io/FSharp.Data/library/XmlProvider.html),它可能更适合功能性方法
我想知道使用 XmlReader 以惯用的函数式样式读取 XML 会是什么样子。即应该如何对待 XmlReader 作为有状态实体。有好的例子吗?
【问题讨论】:
如果您需要处理大型 XML 文档而不读取内存中的整个文档(即流处理),我会说 XmlReader 是一个不错的选择。它不是特别实用,但这很好 - 在 F# 中执行 I/O 时,您不需要以函数方式编写它,因为 I/O 总是很棘手(并非不可能,但 F# 用户只是倾向于使用标准 .NET 库)。
如果您的文件适合内存,并且具有相当规则的结构,那么 John 提到的 XML 类型提供程序是最佳选择。调用提供者时,您可以给它一个示例 XML 文件,提供者推断结构,您可以以良好的类型化方式读取 XML。
如果您有一个结构复杂的不规则文件(例如 XHTML),那么我会使用 XDocument 类型(它的 API 比 XmlDocument 更现代,并且可以从 F# 中轻松使用)。
【讨论】:
XDocument 而不是XmlDocument,除非有特定原因不使用(例如,与遗留代码互操作)。 XDocument 速度更快,内存效率更高,它还允许您使用 Xlinq 实现从 XML 文档中快速提取数据。