Поскольку первым параметром для readDocument и writeDocument является [SysConfig], вам может потребоваться использовать такой пакет, как GetOpt, для обработки операций чтения текста из командной строки и преобразования его в требуемые объекты.Я взял список «доступных опций» на странице 50 тезисов и создал тип Options с текущими соответствующими SysConfigs (из Text.XML.HXT.Arrow.XmlState.SystemConfig).За исключением частей, которые были настроены для конкретного приложения под рукой, остальные (например, cmdLineOpts) были взяты непосредственно из документации GetOpt.
import System.Console.GetOpt
import System.Environment
import System.Exit
import Text.XML.HXT.Core
data Options = Options {
withvalidate :: SysConfig
, withchecknamespaces :: SysConfig
, withcanonicalize :: SysConfig
, withremovews :: SysConfig
, withtrace :: SysConfig
, output_file :: String }
defaultOptions = Options { withvalidate = (withValidate no)
, withchecknamespaces = (withCheckNamespaces no)
, withcanonicalize = (withCanonicalize no)
, withremovews = (withRemoveWS no)
, withtrace = (withTrace 0)
, output_file = "" }
options :: [OptDescr (Options -> Options)]
options =
[ Option ['V'] ["withValidate"]
(ReqArg (\v opts -> opts { withvalidate = withValidate (v == "yes") } ) "")
"perform DTD validation"
, Option ['n'] ["withCheckNamespaces"]
(ReqArg (\n opts -> opts { withchecknamespaces = withCheckNamespaces (n == "yes") } ) "")
"check namespaces"
, Option ['c'] ["withCanonicalize"]
(ReqArg (\c opts -> opts { withcanonicalize = withCanonicalize (c == "yes") } ) "")
"canonicalize document"
, Option ['w'] ["withRemoveWS"]
(ReqArg (\w opts -> opts { withremovews = withRemoveWS (w == "yes") } ) "")
"remove whitespace used for document indentation"
, Option ['t'] ["withTrace"]
(ReqArg (\t opts -> opts { withtrace = withTrace (read t) } ) "")
"set trace level"
, Option ['o'] ["outputFile"]
(ReqArg (\o opts -> opts { output_file = o } ) "")
"output file" ]
cmdLineOpts :: [String] -> IO (Options, [String])
cmdLineOpts argv =
case getOpt Permute options argv of
(o, n, []) -> return (foldl (flip id) defaultOptions o, n)
(_, _, errs) -> ioError (userError (concat errs ++ usageInfo header options))
where header = "Using: [OPTION ...]"
main :: IO ()
main = do (opts, (src:_)) <- cmdLineOpts =<< getArgs
[rc] <- runX $ processDocument opts src
exitWith $ if rc >= c_err then ExitFailure (-1) else ExitSuccess
processDocument :: Options -> String -> IOSArrow b Int
processDocument (Options val ns can ws tr out) src =
readDocument [val, ns, can, ws, tr] src >>>
removeAllWhiteSpace >>> propagateNamespaces >>>
writeDocument [val, ns, can, ws, tr] out >>>
getErrStatus