HXT:重用"preparsed"数据
HXT: reuse "preparsed" data
我正在尝试 'preparse' XML 将 HXT 放入 [XmlTree] 一次,然后多次重复使用此数据。
下面是我的代码:
{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
import Text.XML.HXT.Core
parseXML = readDocument [ withValidate no
, withRemoveWS yes -- throw away formating WS
]
atTag tag = deep (isElem >>> hasName tag)
data UiWindow = UiWindow {
wndName :: String,
wndNameLib :: String,
wndChildren :: [UiWindow]
} deriving (Show)
initUiWindow = UiWindow {
wndName = "empty",
wndNameLib = "",
wndChildren = []
}
parseDoc docName = runX $ parseXML fileName >>> getWindow
where
fileName = docName ++ ".xml"
getWindow = atTag "Window" >>> proc x -> do
libraryItemName <- getAttrValue "libraryItemName" -< x
name <- getAttrValue "name" -< x
children <- arrIO parseDoc -< libraryItemName
returnA -< initUiWindow { wndName = name, wndNameLib = libraryItemName, wndChildren = children}
documentName = "DOMDocument.xml"
parseRoot = parseXML documentName
--runX (parseRoot >>> getWindow )
如果我事先解析:
λ: x <- runX parseRoot
λ: :t x
x :: [XmlTree]
λ: :t getWindow
getWindow :: IOSLA (XIOState ()) XmlTree UiWindow
我如何运行这样的事情:
runX $ XYZ(x) >>> getWindow
或者这个:
runX $ XYZ(x) >>> getSomethingElse
允许我重复使用 'x' 中的数据。
您需要在 parseDoc 中执行与在 getWindow 中相同的操作:
runX $ parseXML filename >>> proc myDoc -> do
window <- getWindow -< myDoc
something <- getSomethingElse -< myDoc
在阅读了更多关于箭头的信息后,我发现了这个:
λ: :t constA
constA :: ArrowList a => c -> a b c
现在在 XmlTree
类型的元素上使用 constA
我们得到一个可以重复使用的箭头:
main = do
x <- runX parseRoot
windows <- runX $ constA (head x) >>> getWindow
doors <- runX $ constA (head x) >>> getDoor
我必须使用 head x
,因为 x
将是 [XmlTree]
类型,但第二个箭头需要 XmlTree
.
我正在尝试 'preparse' XML 将 HXT 放入 [XmlTree] 一次,然后多次重复使用此数据。
下面是我的代码:
{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
import Text.XML.HXT.Core
parseXML = readDocument [ withValidate no
, withRemoveWS yes -- throw away formating WS
]
atTag tag = deep (isElem >>> hasName tag)
data UiWindow = UiWindow {
wndName :: String,
wndNameLib :: String,
wndChildren :: [UiWindow]
} deriving (Show)
initUiWindow = UiWindow {
wndName = "empty",
wndNameLib = "",
wndChildren = []
}
parseDoc docName = runX $ parseXML fileName >>> getWindow
where
fileName = docName ++ ".xml"
getWindow = atTag "Window" >>> proc x -> do
libraryItemName <- getAttrValue "libraryItemName" -< x
name <- getAttrValue "name" -< x
children <- arrIO parseDoc -< libraryItemName
returnA -< initUiWindow { wndName = name, wndNameLib = libraryItemName, wndChildren = children}
documentName = "DOMDocument.xml"
parseRoot = parseXML documentName
--runX (parseRoot >>> getWindow )
如果我事先解析:
λ: x <- runX parseRoot
λ: :t x
x :: [XmlTree]
λ: :t getWindow
getWindow :: IOSLA (XIOState ()) XmlTree UiWindow
我如何运行这样的事情:
runX $ XYZ(x) >>> getWindow
或者这个:
runX $ XYZ(x) >>> getSomethingElse
允许我重复使用 'x' 中的数据。
您需要在 parseDoc 中执行与在 getWindow 中相同的操作:
runX $ parseXML filename >>> proc myDoc -> do
window <- getWindow -< myDoc
something <- getSomethingElse -< myDoc
在阅读了更多关于箭头的信息后,我发现了这个:
λ: :t constA
constA :: ArrowList a => c -> a b c
现在在 XmlTree
类型的元素上使用 constA
我们得到一个可以重复使用的箭头:
main = do
x <- runX parseRoot
windows <- runX $ constA (head x) >>> getWindow
doors <- runX $ constA (head x) >>> getDoor
我必须使用 head x
,因为 x
将是 [XmlTree]
类型,但第二个箭头需要 XmlTree
.