【问题标题】:Using XML-Typeprovider from another Module使用来自另一个模块的 XML-Typeprovider
【发布时间】:2019-05-13 07:16:03
【问题描述】:

我正在使用 F# 对 XML 文件进行分析。 由于代码量越来越大,我决定将我的代码分成不同的文件。

所以我创建了一个看起来像这样的新文件:

module Analyis

open FSharp.Data
open System

type someXml = XmlProvider<"someXMLFile.xml">

// Some Analysis functions down here

当我现在尝试从另一个文件中使用我的类型时,无法再找到应该由 typeprovider 生成的子类型:

open Analysis

let importantFunction (data:someXml) =
    let thisDoesNotWork = data.someProperty

// more code

只有当我像这样在函数内部加载数据时它才有效:

open Analysis

let importantFunction =
    let data = someXml.GetSample()

    let nowItWorks = data.someProperty

// more code

问题:

  • 是否有具体原因,为什么这不起作用?

  • 如何有一种“正确”的方式将 XmlType 分离到另一个文件中?

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    您可以将示例分离到它们自己的文件中。

    我是这样使用的

    module infoParser =
    
        open FSharp.Data
    
        type jsonProvider = JsonProvider<"./schemaSamples/fileSchema.json", EmbeddedResource="Parsers, fileschema.json">
    
        type Info (textJsonIn: string) =
            let parsedInfo = jsonProvider.Parse(textJsonIn)
    

    现在您可以创建一个信息“实例”并访问这些字段。

    在我的例子中,我使用 C# 类中的 infoParser 并通过构造函数调用获取实例

    var info = new Info(myJsonString);
    

    我的代码基于一个 XML 示例,因此它应该满足您的需求。

    【讨论】:

    • 如果我使用这种方法两次 - 会不会有更大的内存占用?你知道为什么我上面的代码不起作用吗?
    • 我假设您只是错过了代码示例最后一行中的.Parse。我猜您在第二次尝试中使用的GetSample 会自动执行该步骤。关于内存占用,我认为不会增加。解析样本后,结果应存储在 parsedInfo 中并重复使用 - 但我尚未对此进行测试。
    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 2017-01-28
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多