![](/img/trans.png)
[英]How to check if an xml file is valid against xsd at runtime (not JUnit) using standard javax.xml.validation.Validator
[英]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.