ゲームのユーザー インターフェイスを記述する XML ファイルを解析し、同時に HXT を学習しようとしています。1 つの XML ファイルを正常に解析できます。getWindow
しかし、関数内で他の XML ファイルを開いて解析する最良の方法は何かを理解できませんでした。
各 XML は、いくつかの で構成されますWindow
。それぞれWindow
にname
と がありlibraryName
ます。後者は、ウィンドウを記述する XML ファイルの名前です。たとえば、ルートは次のようになります。
<!-- DOMDocument.xml -->
<elements>
<Window libraryItemName="window_home" name="window_home">
<!-- data here -->
</Window>
<Window libraryItemName="window_battle" name="window_battle">
<!-- data here -->
</Window>
</elements>
そして、ウィンドウごとに個別の XML ファイルがあります。例 "window_home":
<!-- window_home.xml -->
<elements>
<Window libraryItemName="panel_tabs" name="panel_tabs" selected="true">
<!-- data here -->
</Window>
<Window libraryItemName="home_powerup_menu" name="home_powerup_menu" selected="true">
<!-- data here -->
</Window>
<Window libraryItemName="panel_name" name="panel_name" selected="true">
<!-- data here -->
</Window>
</elements>
次のコードでルートを解析DOMDocument.xml
します。
{-# 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 = []
}
getWindow = atTag "Window" >>>
proc x -> do
_libraryItemName <- getAttrValue "libraryItemName" -< x
_name <- getAttrValue "name" -< x
-- TODO: Open _libraryItemName XML file and parse windows in it
returnA -< initUiWindow { wndName = _name, wndNameLib = _libraryItemName}
documentName = "DOMDocument.xml"
parseRoot = parseXML documentName
--runX (parseRoot >>> getWindow )
getWindow
関数が内部にラップされていないためIO
、目的の動作を実現するための最良の方法は何ですか?