就在最近,我处理了一些交通和旅行信息的数据,即数据Datex2 http://www.datex2.eu/content/datex-ii-xml-schema-21格式。该项目时间不长,现在已经结束,我像往常一样继续生成了一堆强类型 C# 类xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx工具,做了一些序列化、轻处理等。然而,现在事后看来,我开始想知道这对于 F# 类型提供程序是否是一个很好的案例,因此我第一次尝试这个主题。
考虑到这一点,一个人应该如何处理存在以下情况的情况:复杂图式 http://www.datex2.eu/archived-document/35这不应该经常改变吗?由于没有公开可用的类型提供程序可以直接从架构推断类型,我想选项是:
- Use the XML 类型提供者 http://fsharp.github.io/FSharp.Data/library/XmlProvider.html.
- 使用外部工具生成类型,xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx在这种情况下——从WSDL 类型提供者 http://msdn.microsoft.com/en-us/library/vstudio/hh362328.aspx(它使用svcutil.exe http://msdn.microsoft.com/en-us/library/aa347733%28v=vs.110%29.aspx).
- 手动滚动类型(可能会修改输出xsd.exe http://msdn.microsoft.com/en-us/library/x6c1kb0s%28v=vs.110%29.aspx).
- 生成类型(如上一个项目符号所示)/使用 XML 类型提供程序并在后台进行持续的序列化、反序列化和架构验证。
然后我也开始想知道 C#-F# 的故事(例如生成或删除的类型)以及如果我想修改类型以更好地检查约束(例如<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">
在架构中,同时还提供良好的开发人员体验。
滚动自己的类型看起来是一项相当费力的工作,最后两点似乎是最吸引人的,所以采取所描述的路线here https://stackoverflow.com/questions/4150164/programmatically-use-xsd-exe-tool-feature-generate-class-from-xsd-schema-throu by nos https://stackoverflow.com/users/126769/nos在另一个SO帖子中。我用了System.Xml
and System.CodeDom
并修改了代码以使用Microsoft.FSharp.Compiler.CodeDom
and FSharpCodeProvider
生成 F# 类型。
唉!生成的 F# 代码无法编译(即使在添加适当的引用等之后)。此时,我想我可以询问一些指示。
问题:如果我想在开发周期中尽早强制执行给定模式中描述的约束,是否有一种推荐的、有经验的方法来创建类型提供程序以符合稍微复杂的 XML 模式(以 Datex2 作为案例示例) ?
Rune FS https://stackoverflow.com/users/112407/rune-fs正在尝试对此进行尝试,请参阅他的SO问题在提供的类型上出现编译错误 https://stackoverflow.com/questions/20466880/getting-compile-error-on-provided-type.
这是一个非常复杂的问题,我想没有简单的答案 - 我认为您可能列举了所有选项以及它们的大部分权衡。对于一次性项目,仅出于单一目的构建特定类型提供程序实际上没有意义,因此我认为使用 XML 提供程序或代码生成是唯一的选择。代码生成(当修改生成的代码时)是维护的噩梦。
至于 XML 类型提供程序,我们有一个工作项目 https://github.com/fsharp/FSharp.Data/issues/57添加对 XSD 的支持(这将是很好的社区贡献,因为它是相当独立的),所以如果我们有这样的支持,那么我相信使用 XML 类型提供程序将是完美的,因为您可以将 DATEX II 模式传递给它。
目前,F# Data 使用擦除类型(不利于 C# 互操作),但我们实际上正在考虑切换到生成类型,这将使提供程序可以从 C# 使用(通过小型 F# 项目) - 所以,我认为类型提供程序就是答案在这里,但它们可能需要一些改进才能完美适合您的项目(但是,F# Data 是一个开源项目,我们始终欢迎贡献:-))。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)