2016-07-12 9 views
0

コードを修正するにはどうすればよいですか?インライン/静的に解決された型は、構造型と同じ強力ですか?タイプ 'XmlProvider <...>。パラメータ'は演算子 'get_Value'をサポートしていませんか?

タイプ 'XmlProvider <>。'パラメータ '演算子' 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 

答えて

6

Value単一タイプ有するノード(タイププロバイダが統一することができ、またはタイプを、例えば、2および3.0)のために定義されています。あなたの例では、2番目の値は文字列xxxであるため、パラメータは2つのプロパティを受け取ります。NumberおよびStringそれぞれのタイプはoptionです。あなたはどちらかあなたの入力は1つの一貫性のある値の型(xxx&RIGHTARROW; 2)持っている

  • 変更

     
    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)") 
    
  • あなたが先行値がわからない場合、あなたはまた、すべてでそれらを推測しませにタイププロバイダに伝えることができます。これはparametersValue : string性質を持つことになります

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

    を。

+0

ありがとうございます。これはトークンが「1」の場合に機能します。しかし、 '1'から 'a1'に変更した後でテストすると失敗します。実際の入力は、数値に変換できないテキストにすることができます。 – ca9163d9

+1

はい、すべての値がちょうど 'string'なので、あなたは' Value'をもう一度持っています。 適切なタイプを生成するには、入力の代表*サンプルが必要です。 – CaringDev

+0

@ dc7a9163d9最後に追加されたオプションを参照 – CaringDev

関連する問題