在下面的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>我使用一个可能来表示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中的可选元素并将其转换为x?
发布于 2017-07-21 07:21:27
我刚刚发现了withDefault函数,并且能够让它像这样工作:
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 <- withDefault (arr Just <<< getText <<< getChildren <<< deep (hasName "defaultType")) Nothing -< x
returnA -< BankingInfo i d b t a ghttps://stackoverflow.com/questions/45226590
复制相似问题