首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hxt和解析可选元素

Hxt和解析可选元素
EN

Stack Overflow用户
提问于 2017-07-21 07:12:36
回答 1查看 71关注 0票数 1

在下面的xml片段中,我试图使用HXT解析一个可选元素,这是非常困难的:

代码语言:javascript
复制
<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元素:

代码语言:javascript
复制
data BankingInfo = BankingInfo { bankingID   :: String
                               , bankingDesc :: String
                               , bankCode    :: String  
                               , bankTransit :: String  
                               , bankAccount :: String
                               , defaultType :: Maybe String  
                               } deriving (Show, Eq)

我像这样解析accountBankingInfo元素:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2017-07-21 07:21:27

我刚刚发现了withDefault函数,并且能够让它像这样工作:

代码语言:javascript
复制
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 g
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45226590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档