Статус чтения из-за неудачной проверки Relax NG в HXT

#haskell #relaxng #hxt

#haskell #relaxng #hxt

Вопрос:

Проверка 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:

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

Результирующее дерево с ошибочным документом действительно содержит status module ) атрибут:

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

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

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

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

Ответ №1:

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

Обработка ошибок HXT находится в Text.XML.HXT.Arrow.XmlState.Обработка ошибок с интересной функцией 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
  

Комментарии:

1. Таким образом, все сообщения об ошибках выводятся на stderr . Этого можно было бы избежать, используя errorMsgCollect и впоследствии getErrorMessages , но я не уверен, как вернуть обе стрелки (результат getErrorMessages и of getErrStatus ).