2016-04-19 79 views
0

我一直在考慮使用Saxon 9.6作爲XSD 1.1驗證器和XSD斷言。是否可以使用Saxon驗證器定義我自己的錯誤消息(不是默認的)?撒克遜和XML Schema 1.1自定義驗證消息

+0

請參閱[net.sf.saxon.s9api.SchemaManager.getErrorListener()](http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/SchemaManager.html#getErrorListener( ))和[setErrorListener()](http://www.saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/SchemaManager.html#setErrorListener(javax.xml.transform.ErrorListener)) – kjhughes

回答

1

想到幾種機制。

首先,你可以定義斷言確實其他方面有關自己的消息:

http://www.saxonica.com/documentation/index.html#!schema-processing/extensions11/saxon.message

其次,你可以把所有的驗證信息到XML報告文件,然後你就可以改變。在Validate命令行上使用-report:filename,或者在s9api API中使用SchemaValidator.setValidityReporting()。報告文件的格式由saxon-resources.zip下載文件中的模式定義。

你可以使用一個ErrorListener通過@kjhughes的建議 - 在傳遞給ErrorListener的ValidationException對象的錯誤信息是在相當結構化的形式 - 但(一)我覺得XML報告更容易操縱,和(b )我們發現在驗證運行中報告幾百個錯誤,創建界面所需的異常對象的成本可能是整個運行時間的相當大的一部分。 Java異常並不是真正爲此設計的。

+0

撒克遜:消息真的很棒,儘管它僅適用於方面。是否有可能以某種方式爲結構驗證定義自定義消息(cplx類型等)?謝謝 – Yuri

+1

不,對不起。我想過但沒有找到辦法。問題在於複雜類型定義的部分和錯誤消息之間沒有簡單的對應關係。當你的輸入對一個複雜的類型無效時,撒克遜會花費一些努力試圖找出真正的錯誤,導致沿着這些消息的消息「X元素在這裏是無效的,但如果它在名字空間N中則是有效的」 。 –

+0

是的,我是這麼認爲的。如何繪製cplx類型定義和相關錯誤消息之間的連接沒有簡單的方法。不管怎麼說,還是要謝謝你! – Yuri