#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
и ofgetErrStatus
).