2011-04-01 80 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