0

ゲームのユーザー インターフェイスを記述する XML ファイルを解析し、同時に HXT を学習しようとしています。1 つの XML ファイルを正常に解析できます。getWindowしかし、関数内で他の XML ファイルを開いて解析する最良の方法は何かを理解できませんでした。

各 XML は、いくつかの で構成されますWindow。それぞれWindownameと があり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、目的の動作を実現するための最良の方法は何ですか?

4

1 に答える 1

1

HXT コンビネータはポリモーフィックでありIOLA、XML 解析に関連するすべての型クラスを実装する型があり、それに加えて中矢印ArrowIOを実行できます。IO

たとえば、ファイルを完全に再帰的に解析したい場合は、次のように簡単に実行できます。

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}
于 2015-12-22T14:15:32.790 に答える