2011-04-01 2 views
0

나는 내가 .NET 객체로 변환 할 웹 서비스에서 다음 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에서 볼 수있는 모든 요소를 ​​포함하지 않는 경우가 있습니다. 이 동일한 웹 서비스는 다른 유형의 응답에서도 이러한 동일한 요소를 재사용합니다. 액티브 패턴을 사용하여 개체로 다시 변환하는 XML을 deserialize하는 일반적인 방법을 만드는 것이 가능합니까? 이 웹 서비스는 속성을 사용하여 정보를 보내지 않으며,이 요소는 요소 내부의 요소로 보이므로이 문제를 쉽게 처리 할 수 ​​있습니다. 잘못된 방향으로 가고 싶다면 더 나은 것을 제안하십시오. 사전에

감사합니다,

답변

0

당신의 접근 방식

밥은 나에게 좋아 보인다 노드의 다른 유형에 맞게 활성 패턴을 사용합니다. 아마도 부분 패턴 (일치하는 경우 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의 주요 부분을 계정 목록으로 표현할 수 있고 (활성 패턴을 사용하여 모든 계정 속성을 구문 분석 할 수있는 것 같습니다.)

+0

감사합니다,이 내 문제의 일부를 해결할 수 있지만 다른 부분은. NET 개체를 얻는 가장 좋은 방법입니다. 이 xml을 LogInResponse 형식으로 변환하는 가장 좋은 방법은 무엇입니까? 다른 요소에 동일한 요소가 포함되어있을 때 코드를 다시 사용할 수 있도록 요소 내의 요소를 처리하는 가장 좋은 방법은 확실하지 않습니다. 상황을 단순화하기 위해 xml 문자열에서 accounts 요소를 제거했습니다. – Beaker

+0

드디어 내 xml에서 도메인 객체를 가져 오려고 포기했습니다. 당신이 내 질문에 적어도 부분적으로 대답했기 때문에 대답을 표시하고 있습니다. – Beaker

+0

BTW, 내 문제를 해결하는 방법에 대해 궁금한 사람은 Linq to XML을 사용하여 도메인 개체를 가져옵니다. – Beaker