Считать статус из-за неудачной проверки Relax NG в HXT - PullRequest
0 голосов
/ 06 апреля 2011

Проверка XML-файла в Haskell прекрасно работает с 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 содержит следующую информацию согласно документации hxt-relaxng :

в случае ошибок проверки пустой документ с информацией о состоянии в корне [выводится]

Полученное дерево с ошибочным документом действительно содержит атрибут statusmodule):

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

Теперь вопросы:

Как проверить вывод validateDocumentWithRelaxSchema, была ли ошибка проверки?

Есть ли предопределенная функция, которую я могу использовать для этого (но еще не нашел)?

1 Ответ

1 голос
/ 06 апреля 2011

Хорошо, я нашел ответ сам:

Обработка ошибок 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
...