2011-04-01 41 views
0

我从一个Web服务下面的XML,我想转换为.NET对象:反序列化与F#

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服务从来没有使用属性来发送信息,它似乎都是元素内的元素,这可能会使这个问题更容易。如果我以这种错误的方式进行讨论,请随时提出更好的建议。

由于提前,

鲍勃

回答

0

你的方法使用主动模式来匹配不同类型的节点对我来说很好。我可能会使用部分模式(它们可以在匹配时返回SomeNone)而不是完整模式(总是返回其中一种情况)。这使您可以为正在处理的不同类型的节点编写多个模式。

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的主要部分表示为帐户列表(并使用活动模式解析所有帐户属性)。

+0

谢谢,这解决了我的问题的一部分,但另一部分是从这个.net对象的最佳方式。将此xml转换为LogInResponse类型的最佳方法是什么?我不确定以某种方式处理元素中元素的最佳方式,以便在其他响应包含某些相同元素时重用代码。我从我的xml字符串中删除了accounts元素来简化事情。 – Beaker 2011-04-01 02:16:52

+0

我终于放弃了试图从我的xml中获取域对象。因为你至少回答了我的问题的一部分,所以我将其标记为答案。 – Beaker 2011-04-03 01:58:08

+0

顺便说一句,我使用Linq to Xml来获取域对象,如果有人对我如何解决我的问题感到好奇。 – Beaker 2011-04-03 01:58:49