簡體   English   中英

使用javax.xml.validation.Validator針對XSD進行XML驗證

[英]XML validation against an XSD using javax.xml.validation.Validator

xsd包含如下聲明:

<xsd:attribute name="IDENTIFIER" use="required" type="xsd:ID" />

xml中的相關行如下所示:

<HEADER IDENTIFIER="invalidId 01">

要么

<HEADER IDENTIFIER="validId01">

類型xsd:ID另請參見http://books.xmlschemata.org/relaxng/relax-CHP-19.html

不允許以冒號,空格或數字開頭。 如果生成的文件在eclipse ide中打開並針對聲明的xsd進行了驗證,則會發現錯誤並正確發出信號。 但是,在JUnit測試期間,將加載相同的xsd,並針對該xsd驗證生成的文件。 該驗證找到任何形式的xml格式,但是找不到無效的屬性IDENTIFIER。

驗證代碼如下:

static boolean validate(Source source) {
    boolean success = false;
    try {
        Validator validator = mySchema.newValidator();
        success = validate(validator, source);
    } catch (SAXException e) {
        logger.info(MSG_BASE + "SAXException: " + e.getMessage());
    } catch (IOException e) {
        logger.info(MSG_BASE + "IOException: " + e.getMessage());
    }
    return success;
}


private static boolean validate(Validator validator, Source source) 
                                                    throws SAXException, IOException {

    ErrorHandler erH = new DefaultHandler2();
    validator.setErrorHandler(erH);
    validator.validate(source);
    return true;
}

有人知道告訴驗證者考慮屬性限制可能會丟失什么嗎?

我沒有使用DefaultHandler2,而是將自己的ValidationErrorHandler設置為:

public class ValidationErrorHandler extends DefaultHandler {

包含:

 @Override
public void error (SAXParseException e) throws SAXException {
throw new SAXParseException(e.getMessage(), buildLocator(e), e);

}

private Locator buildLocator(SAXParseException e) {
    Locator2Impl loc = new Locator2Impl();
    loc.setLineNumber(e.getLineNumber());
    loc.setColumnNumber(e.getColumnNumber());
    loc.setSystemId(e.getSystemId());
    loc.setPublicId(e.getPublicId());
    return loc;
}

警告和FatalError方法相同! 目前,我已擁有所需的一切!

您正確的xsd:ID可能不包含空格。

至於為什么沒有收到來自Java驗證代碼的錯誤,請注意DefaultHandler2()忽略所有解析事件。 特別是關於error()方法:

默認實現不執行任何操作。 應用程序編寫者可以在子類中重寫此方法,以針對每種錯誤采取特定的措施,例如將消息插入日志文件或將其打印到控制台。

通常,實際上,因此記錄了org.xml.sax.ErrorHandler的接口:

警告 :如果應用程序未注冊ErrorHandler,則XML解析錯誤將不被報告,除了SAXParseExceptions會引發致命錯誤。 為了檢測有效性錯誤,必須注冊一個使用error()調用執行某些操作的ErrorHandler。

Xerces2-J隨附SAX樣本源代碼在此方面提供了很好的示例。 特別是, Counter顯示了如何擴展DefaultHandler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM