开发者

Read status from failed Relax NG validation in HXT

开发者 https://www.devze.com 2023-02-22 12:49 出处:网络
Validating an XML file in Haskell works fine with HXT and Relax NG, apart from one thing: how can I get the result?

Validating an XML file in Haskell works fine with HXT and Relax NG, apart from one thing: how can I get the result?

With the following code, the XML file xmlFilename gets validated against the Relax NG scheme rngFilename. In case of an error, an error is output to stderr, and the evaluation continues.

v <- runX
    ( readDocument
        [ withRemoveWS yes   -- remove redundant whitespace
        , withValidate no    -- don't validate source by DTD
        ] xmlFilename
      >>>
      -- validate source by Relax NG
      validateDocumentWithRelaxSchema [] rngFilename
    )

In case of an error, the variable v holds the following information according to the hxt-relaxng documentation:

in case of validation errors, an empty document with status information in the root [is output]

The resulting tree with a faulty document really holds a status (and module) attribute:

NTree (XAttr "module") [NTree (XText "validate document with Relax NG schema") []],
NTree (XAttr "status") [NTree (XText "2") []]

No开发者_运维百科w the questions:

How can I check the output of validateDocumentWithRelaxSchema whether there was a validation error?

Is there a predefined function I can use for that (but haven't found yet)?


Ok, I found the answer myself:

HXT error handling is located in Text.XML.HXT.Arrow.XmlState.ErrorHandling with the interesting function getErrStatus.

v <- runX
    ( readDocument
        [ withRemoveWS yes   -- remove redundant whitespace
        , withValidate no    -- don't validate source by DTD
        ] xmlFilename
      >>>
      -- validate source by Relax NG
      validateDocumentWithRelaxSchema [] rngFilename
      >>>
      getErrStatus
    )

case v of
    --severity [0]=[c_ok]
    [0] -> --continue processing

    --severity: [1]=[c_warn], [2]=[c_err], [3]=[c_fatal], else=something_really_really_bad_happened
    _ -> --do error handling
0

精彩评论

暂无评论...
验证码 换一张
取 消