2013-09-28 4 views
2

나는 다음과 같은 XML이 :HXT 트리를 어떻게 매핑합니까?

<list> 
    <recipient> 
     <name></name> 
     <lastname></lastname> 
     <email></email> 
     <phone></phone> 
     <home></home> 
    </recipient> 
    <recipient> 
    </recipient> 
</list> 

다음과 같은 데이터 유형을 :

data Recipient = Recipient { name  :: String 
          , lastname :: String 
          , email :: String 
          , phone :: Maybe String 
          , home  :: Maybe String } 

내가 XML을 읽고 다시 수신자 목록을 얻을 수 있습니다 싶지 : [수신자]
을 이렇게하려면 다음을 작성했습니다.

트리를 매핑하는 방법에 대한 설명이 있습니까?

+0

아마지도가 생각 오른쪽 일치하지 않는이

readMyXml path = do fi <- readFile path let doc = readString [withValidate no] fi return =<< runX $ getRecipients doc wrapStr a = if null a then Nothing else Just a getD a = deep (hasName a) >>> removeAllWhiteSpace >>> deep getText getMD a = getD a >>^ wrapStr getRecipients doc = doc >>> deep (hasName "list") >>> multi (hasName "recipient") >>> proc y -> do nime <- getD "name" -< y lstn <- getD "lastname" -< y mail <- getD "email" -< y phon <- getMD "phone" -< y homi <- getMD "home" -< y returnA -< Recipient nime lstn mail phon homi 

:
나는하여 전체 readMyXml 기능을 대체했다. 어쨌든 목표는 여전히 트리를받는 사람 목록으로 줄이는 것입니다. 트리에서 반복하고 반복 프로세스에서 목록을 구성 할 수있는 함수 (화살표를 읽을 수도 있음). – Sarfraz

+0

안녕하세요, 코드의 양을 줄여주세요. 기꺼이 도와 드리겠습니다.하지만 10 줄 문제에 대해 50 줄 정도의 코드를 읽으려고하지는 마십시오. – jozefg

+0

또한, 작은 최상위 함수가 하스켈에서 괜찮습니다. 모든 것을 'where'로 치지 마십시오. – jozefg

답변

1

트리를 반복 할 필요가 없음을 알았습니다. HXT는 이미 그것을합니다. 내가 작성한 순진한 것보다 XML에서 데이터를 생성하는 더 간단한 방법이 있습니다. 이제 질문에 정의 된 문서에 적용 getRecipients의 반환 [수신자]
건배

관련 문제