首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HXT泡菜OpenTable

HXT泡菜OpenTable
EN

Stack Overflow用户
提问于 2013-10-28 20:01:46
回答 1查看 251关注 0票数 2

我正在为OpenTable xml文件编写一个pickler。这是我第一次使用HXT,我有一些问题。

我的第一个问题是绑定是多种元素的列表。我该怎么写装订呢?

我包括完整的来源

Haskell数据类型:

代码语言:javascript
复制
module OpenTable
   where

data OpenTable = OpenTable { meta :: Meta
                           , bindings :: [Binding]
                           } deriving (Read, Show)

data Meta = Meta { metaApiKeyURL        :: Maybe String
                 , metaAuthor           :: Maybe String
                 , metaDocumentationURL :: Maybe String
                 , metaDescription      :: Maybe String
                 , metaSampleQuery      :: Maybe String
                 } deriving (Read, Show)

data Binding = SelectBinding Select
             | InsertBinding Insert
             | UpdateBinding Update
             | DeleteBinding Delete
             deriving (Read, Show)

data Select = Select { selectItemPath                :: Maybe String
                     , selectPollingFrequencySeconds :: Maybe Integer
                     , selectProduces                :: Maybe String
                     , selectUrls                    :: [String]
                     , selectInputs                  :: [Input]
                     }  deriving (Read, Show)
....

解析器:

代码语言:javascript
复制
module Main
       where

import System.Environment
import Text.XML.HXT.Core
import OpenTable

main :: IO ()
main
    = do
      [file] <- getArgs
      parseYQL file
      return ()

instance XmlPickler OpenTable where
  xpickle = xpOpenTable

xpOpenTable :: PU OpenTable
xpOpenTable
  = xpElem "table" $
    xpWrap ( uncurry OpenTable
           , \ot -> (meta ot, bindings ot)) $
    xpPair xpMeta xpBindings

instance XmlPickler Meta where
  xpickle = xpMeta

xpMeta :: PU Meta
xpMeta
  = xpElem "meta" $
    xpWrap ( \ ((api, aut, doc, des, sam)) -> Meta api aut doc des sam
           , \ m -> (metaApiKeyURL m, metaAuthor m, metaDocumentationURL m,
                     metaDescription m, metaSampleQuery m)) $
    xp5Tuple
    (xpOption $ xpElem "apiKeyUrl" xpText)
    (xpOption $ xpElem "author" xpText)
    (xpOption $ xpElem "documentationURL" xpText)
    (xpOption $ xpElem "description" xpText)
    (xpOption $ xpElem "sampleQuery" xpText)

xpBindings :: PU [Binding]
xpBindings = xpElem "bindings" $
             xpList xpBinding

instance XmlPickler Binding where
  xpickle = xpBinding

xpBinding :: PU Binding
xpBinding = undefined



parseYQL file
  = runX ( xunpickleDocument xpOpenTable [] file
           >>>
           xpickleDocument xpOpenTable [] "dst.xml" )

OpenTable XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd">
  <meta>
    <sampleQuery>select * from {table} where q="this is a test" and target="de";</sampleQuery>
  </meta>
  <bindings>
    <select itemPath="json" produces="JSON">
      <urls>
        <url>http://translate.google.com/translate_a/t?client=x&amp;text={q}&amp;sl={source}&amp;tl={target}</url>
      </urls>
      <inputs>
        <key id='q' type='xs:string' paramType='query' required="true" />
        <key id='source' type='xs:string' paramType='path' default="auto" />
        <key id='target' type='xs:string' paramType='path' required="true" />
      </inputs>
    </select>
  </bindings>
</table>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 21:39:13

HXT为sum数据类型提供了xpAlt :: (a -> Int) -> [PU a] -> PU a函数。第一个参数将和类型a的值映射到Ints,然后将其用作索引到第二个参数中的PU as列表中,即根据传递给第一个参数中的函数的a值选择适当的PU a

对于您的代码,您可以尝试这样的方法:

代码语言:javascript
复制
xpBinding :: PU Binding
xpBinding = xpAlt tag ps
  where
    tag (SelectBinding s) = 0
    tag (InsertBinding i) = 1
    -- ...
    ps = [ xpSelectBinding
         , xpInsertBinding
         -- ...
         ]

xpSelectBinding :: PU Binding
xpSelectBinding = ...

xpInsertBinding :: PU Binding
xpInsertBinding = ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19644019

复制
相关文章

相似问题

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