2011-04-05 55 views
0

哈斯克爾驗證XML文件中正常工作與HXT從一件事RELAX NG,除了:我怎樣才能得到結果?讀取狀態從失敗的RELAX NG驗證在HXT

使用下面的代碼,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

好吧,我發現了自己的答案:

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 
+0

這樣,所有的錯誤信息都輸出到'stderr'。這可以通過使用'errorMsgCollect'和之後'getErrorMessages'來避免,但我不知道如何返回兩個箭頭(getErrorMessages和getErrStatus的結果)。 – fabb 2011-04-05 21:39:54