2012-09-04 16 views
8

在搜索用XSD驗證我的XML的最佳方法後,我遇到了java.xml.validator。如何在使用java.xml.validator對XSD驗證XML時獲得更具體的錯誤

我開始使用示例代碼從API並加入我自己的ErrorHandler

這工作得很好,但是,傳遞給我的XsdValidationErrorHandler該消息並沒有給我的確切位置的任何指示在文檔中有問題的XML是:

"org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'X'. One of '{Y}' is expected." 

有我重寫或插入式驗證的另一部分,這樣我就可以定義發送到的ErrorHandler我自己的錯誤信息,而不必重寫所有的方式的代碼?

我應該使用不同的庫嗎?

回答

9

嘗試捕獲SaxParseException,它是SaxException的後代。如果你得到其中的一個,它有方法getLineNumber(),getColumnNumber()等。

+0

你是對的,它有一個getLineNumber()方法 - 我錯過了這個。行號也是有意義的 - 如果我無法從數據本身獲得一些更具體的信息,那麼我可以使用它。 – Levity

3

在解析時進行驗證。這將使位置信息可用,並且ErrorHandler將報告它。

只需創建Schema創建DocumentBuilderFactory之前,並把它像這樣:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(false); 
dbf.setSchema(schema); 

注:setValidating()方法告訴DBF是否要使用DTD驗證。設置模式告訴它使用模式驗證。

+0

這是一個很好的答案,因爲'getLineNumber()'和'getColumnNumber'呼籲'SAXParseException'將返回-1考慮到問題中的場景。不過,我希望得到的答案是解析器需要一個錯誤處理程序。花了我一段時間才弄清楚如何正確使用它。 – Magnilex

3

你可以做exception.getLineNumber()exception.getColumnNumber()來獲得錯誤的座標。 This是一個類似的問題。

+0

有沒有辦法讓標籤名稱出現錯誤 – Gnana

0
public class KitXsdErrorHandler implements ErrorHandler { 

    @Override 
    public void warning(SAXParseException exception) throws SAXException { 
     handleMessage("Warning", exception); 
    } 

    @Override 
    public void error(SAXParseException exception) throws SAXException { 
     handleMessage("Error", exception); 
    } 

    @Override 
    public void fatalError(SAXParseException exception) throws SAXException { 
     handleMessage("Fatal", exception); 
    } 

    private String handleMessage(String level, SAXParseException exception) throws SAXException { 
     int lineNumber = exception.getLineNumber(); 
     int columnNumber = exception.getColumnNumber(); 
     String message = exception.getMessage(); 
     throw new SAXException("[" + level + "] Sətr nömrə: " + lineNumber + " Sütun nömrə: " + columnNumber + " message: " + message); 
    } 
} 

此信息是有用的太

How to get internalization with validation messages of SAX XML Schema Validator?

http://vijiprakash.blogspot.com/2008/05/custom-error-message-in-xml-xsd.html