类型' XmlProvider< ...> .Parameter'不支持运营商' get_Value'?

时间:2016-07-12 19:58:29

标签: f# f#-data

如何修复代码?内联/静态解析类型与结构类型相同吗?

  

类型' 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

1 个答案:

答案 0 :(得分:6)

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

  • 将您的输入更改为一个一致的值类型(xxx2

    let xml1 = XmlProvider<"""<r1><parameters><parameter name="token">1</parameter><parameter name="other">2</parameter></parameters><othersOf1>...</othersOf1></r1>""">.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属性。