0

.net オブジェクトに変換したい Web サービスから次の xml を取得します。

let xmlString = "<?xml version=\"1.0\"?>
<logInResponse>
  <result>OK</result>
  <xmlLogIn>
    <session>11C0ED6F8F7288855FC73C99979A9732.TOGKE6VP9aE8abcdLXaVXg</session>
    <user>WallStreetScumbag1</user>
    <authorizations>
      <insiderTrading>true</insiderTrading>
    </authorizations>
  </xmlLogIn>
</logInResponse>"

これは私がこれまでに持っているものです:

type Result(value:XmlNode) = 
    member this.Value = value.InnerText

let (|Node|Result|) (node : #System.Xml.XmlNode) =
    if node.Name = "result" then
        Result (new Result(node))
    else
        Node (seq {for x in node.ChildNodes -> x})

let extract node =
    let rec extract node =
        match node with 
        | Result(p) ->
            Seq.singleton p
        | Node(nodes) ->
            Seq.collect (fun (n) -> extract n) nodes
    extract node

let xmlDoc = new XmlDocument()
xmlDoc.LoadXml(xmlString)

//type LogIn() =
    //This is where I would create a .net object that mirrors the xml.

ご覧のとおり、いくつかの要素は異なる要素内で繰り返されており、サンプル xml で確認できるように、要素にすべての要素が含まれていない場合があります。この同じ Web サービスは、他のタイプの応答でもこれらの同じ要素の多くを再利用します。アクティブなパターンを使用して、取得した xml をオブジェクトに逆シリアル化する一般的な方法を作成することはできますか? この Web サービスは、属性を使用して情報を送信することはないようです。すべてが要素内の要素であるため、この問題が容易になる可能性があります。私がこれを間違った方法で行っている場合は、お気軽にもっと良い方法を提案してください。

前もって感謝します、

ボブ

4

1 に答える 1

0

アクティブなパターンを使用してさまざまなタイプのノードに一致させるというあなたのアプローチは、私には良さそうです。完全なパターン(常にケースの1つを返す)ではなく、部分的なパターン(Some一致したときに戻るか)を使用する可能性があります。Noneこれにより、処理しているノードのタイプごとにいくつかのパターンを記述できます。

let (|Result|_|) (node:#System.Xml.XmlNode) =
  if node.Name = "result" then
    Some(new Result(node))
  else
    None

パターンマッチングでは、必要な数の部分的なパターンを含め、_(ワイルドカードパターン)を使用して残りのすべてのケースをカバーできます。

match node with 
| Result(p) ->
    Seq.singleton p
| nd ->
    Seq.collect (fun (n) -> extract n) nd.ChildNodes

これ以外はわかりません。例の構造は非常に規則的に見えるため、HTMLのようにケースを処理する必要はありません(<a>他のさまざまな要素にネストできます)。XMLの主要部分をアカウントのリストとして表すことができるようです(そしてアクティブなパターンを使用してすべてのアカウントプロパティを解析します)。

于 2011-04-01T01:47:29.190 に答える