就在最近,我处理了一些交通和旅行信息数据,即Datex2格式的数据。这个项目不是很长,现在已经结束了,我和往常一样继续,用xsd.exe工具生成了一堆强类型的xsd.exe类,做了一些序列化、轻量处理等等。然而,现在回想起来,我开始怀疑对于F#类型提供程序来说,这是否是一个很好的案例,因此我第一次尝试这个主题。
考虑到这一点,我们应该如何处理存在不应该经常更改的复杂图式的情况?由于没有一个可以直接从模式推断类型的公共可用类型提供程序,所以我想这些选项是:
然后,我也开始想知道C#-F#的故事(例如生成或删除类型),如果我想要修改类型以更好地检查模式中的<xs:element name="ilc" type="D2LogicalModel:TpegIlcPointDescriptor" maxOccurs="3">之类的约束,同时也提供良好的开发经验,该怎么办?
滚动自己的类型看起来像一个相当费劲的努力和最后两个点似乎是最有吸引力的,所以采取的路线,如这里在诺思在另一个这样的帖子。我使用了System.Xml和System.CodeDom,并修改了代码以使用Microsoft.FSharp.Compiler.CodeDom和FSharpCodeProvider生成F#类型。
天哪!生成的F#代码不编译(即使添加了适当的引用等)。这时,我想我可以问一些方向。
问题:如果我想在开发周期中尽早执行给定模式中描述的约束,那么是否有一种重新推荐的经验支持的方法来创建一个类型提供程序来符合一个稍微复杂的XML (以Datex2为例)?
<编辑2013-12-10: Rune FS正在尝试尝试,参见他的“所以问题获取所提供类型的编译错误”。
发布于 2013-11-17 08:38:01
这是一个相当复杂的问题,我想没有简单的答案--我想你可能列举了所有的选项,以及它们的大部分权衡。对于一次性项目来说,仅仅为了一个目的构建特定的类型提供程序是没有意义的,所以我认为使用XML提供程序或代码生成是唯一的选择。代码生成(当修改生成的代码时)是维护的噩梦。
至于XML类型提供程序,我们有一个工作项来添加对XSD的支持(这将是很好的社区贡献,因为它是独立的),所以如果我们有了它,那么我相信使用XML类型提供程序将是完美的,因为您可以传递它DATEX II模式。
目前,F#数据使用擦除类型(对于C#互操作不好),但我们实际上正在考虑切换到生成的类型,这将使提供者可以从C# (通过小型F#项目)使用-因此,我认为类型提供程序是这里的答案,但它们可能需要一些改进才能完美地适合您的项目(但是,F#数据是一个开源项目,我们总是欢迎贡献:-)。
https://stackoverflow.com/questions/20024418
复制相似问题