从HXT中读取失败放松NG验证的状态

时间:2011-04-05 20:31:08

标签: haskell relaxng hxt

在Haskell中验证XML文件可以正常使用 HXT Relax NG ,除了一件事:我怎样才能得到结果?

使用以下代码,XML文件xmlFilename将根据Relax NG方案rngFilename进行验证。如果出现错误,则会向stderr输出错误,评估将继续。

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

如果出现错误,变量v根据the hxt-relaxng documentation保存以下信息:

  

如果验证错误,则在根[输出]

中显示状态信息的空文档

带有错误文档的结果树实际上包含status(和module)属性:

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

现在问题:

如何检查validateDocumentWithRelaxSchema的输出是否存在验证错误?

我可以使用预定义的功能(但还没有找到)吗?

1 个答案:

答案 0 :(得分:1)

好的,我自己找到了答案:

HXT错误处理位于Text.XML.HXT.Arrow.XmlState.ErrorHandling,其中包含有趣的函数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