用F#反序列化Xml

我从我想要转换为.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服务从不使用属性来发送信息,它似乎都是元素内部的元素,可能会使这个问题更容易。如果我以错误的方式解决这个问题,请随意提出更好的建议。 提前致谢, 短发     
已邀请:
您使用活动模式匹配不同类型节点的方法对我来说很好。我可能会使用部分模式(可以在匹配时返回
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的主要部分表示为帐户列表(并使用活动模式解析所有帐户属性)。     

要回复问题请先登录注册