次の xml スニペットで HXT を使用してオプションの要素を解析しようとして、頭を悩ませています。
<ns9:accountBankingInfo>
<key>
<accountId>10</accountId>
<bankingId>01</bankingId>
</key>
<bankingInfo>
<description>Bigbank Co.</description>
<eft>
<bankCode>222</bankCode>
<transit>111</transit>
<accountNumber>3333333</accountNumber>
</eft>
</bankingInfo>
<defaultType>ACCOUNT</defaultType> <!-- optional -->
</ns9:accountBankingInfo>
私は Maybe を使用して defaultType 要素を表しています。
data BankingInfo = BankingInfo { bankingID :: String
, bankingDesc :: String
, bankCode :: String
, bankTransit :: String
, bankAccount :: String
, defaultType :: Maybe String
} deriving (Show, Eq)
次のように accountBankingInfo 要素を解析しています。
bankParser :: ArrowXml a => a XmlTree BankingInfo
bankParser = deep (isElem >>> hasLocalPart "accountBankingInfo") >>> proc x -> do
i <- getText <<< getChildren <<< deep (hasName "bankingId") -< x
d <- getText <<< getChildren <<< deep (hasName "description") -< x
b <- getText <<< getChildren <<< deep (hasName "bankCode") -< x
t <- getText <<< getChildren <<< deep (hasName "transit") -< x
a <- getText <<< getChildren <<< deep (hasName "accountNumber") -< x
g <- nc "defaultType" -< x
returnA -< BankingInfo i d b t a g
nc name = ifA (deep (hasName name)) (getChildren >>> getText >>> arr Just) (arr (const Nothing))
コンパイルはできますが、ファイルを解析すると BankingInfo が返されません。BankingInfo 型を変更して defaultType を削除し、その要素の解析について心配しなくても、すべて正常に機能します。
XML でオプションの要素を処理し、それを Maybe x に変換する簡単な方法はありますか?