0

在 Haskell 中验证 XML 文件可以很好地使用HXTRelax 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会根据hxt-relaxng 文档保存以下信息:

在验证错误的情况下,根中包含状态信息的空文档 [输出]

生成的带有错误文档的树确实包含一个status(and module) 属性:

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

现在的问题:

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

有没有我可以使用的预定义函数(但还没有找到)?

4

1 回答 1

1

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

HXT 错误处理位于具有有趣功能的Text.XML.HXT.Arrow.XmlState.ErrorHandlinggetErrStatus中。

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
于 2011-04-05T21:14:14.883 回答