【问题标题】:The type 'XmlProvider<...>.Parameter' does not support the operator 'get_Value'?'XmlProvider<...>.Parameter' 类型不支持运算符'get_Value'?
【发布时间】:2016-07-12 19:58:29
【问题描述】:

如何修复代码?内联/静态解析类型与结构类型一样强大吗?

类型'XmlProvider<...>.Parameter'不支持操作符'get_Value'?

let input1 = """<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>..sample....</othersOf1></r1>"""
let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">xxx</parameter></parameters><othersOf1>...</othersOf1></r1>""">.Parse(input1)

let inline get name parameters =
    parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
    |> Option.map (fun v -> (^P : (member Value : 'b) v))

get "token" xml1.Parameters

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    Value 仅针对具有单一类型(或类型提供者可以统一的类型,例如 2 和 3.0)的节点定义。在您的示例中,第二个值是字符串xxx,因此一个参数获得两个 属性:NumberString,每个都返回各自类型的option。你可以

    • 将您的输入更改为具有一个一致的值类型 (xxx &rightarrow;2)

      let xml1 = XmlProvider12...""">.Parse(input1)
    • 将它们转换为单一的输出类型(例如string

      let inline get name parameters =
          parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
          |> Option.bind (fun v ->
              match (^P : (member Number : int option) v) with
              | Some number -> Some (string number)
              | None -> (^P : (member String : string option) v))
      
    • 创建一个合适的 DU

      type Value = Number of int | Name of string
      
      let inline get name parameters =
          parameters |> Seq.tryFind (fun x -> (^P : (member Name : 'a) x) = name)
          |> Option.map (fun v ->
              match (^P : (member Number : int option) v) with
              | Some number -> Number number
              | None ->
                  match (^P : (member String : string option) v) with
                  | Some s -> Name s
                  | _ -> failwith "Either number or string should be Some(value)")
      
    • 如果你不知道这些值,你也可以告诉类型提供者推断它们:

      XmlProvider<"""...""", InferTypesFromValues=false>
      

      这将导致parameters 具有Value : string 属性。

    【讨论】:

    • 谢谢,当令牌为 1 时,此方法有效。但是,当我将1 更改为a1 后测试它时它失败了。真正的输入可以是不能转换为数字的文本。
    • 是的,那么您又拥有Value,因为所有值都只是strings。您需要有一个代表性输入样本才能生成合适的类型。
    • @dc7a9163d9 查看最后添加的选项
    • 是的,最后一个选项是完美的。因为我可能只是使用下载的 xml 文件来提供 Xml 类型提供程序。很多时候我只想将 xml 内部文本视为文本。
    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多