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中打开并针对daclared xsd进行验证,则会发现错误并正确发出信号。 但是,在JUnit测试期间,将加载相同的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方法相同! 目前我拥有所需的一切!
答案 0 :(得分:0)
xsd:ID
s可能不包含空格,这是正确的。
至于为什么没有从Java验证代码收到错误,请注意DefaultHandler2()
忽略所有解析事件。特别是关于error()
方法:
默认实现不执行任何操作。应用编写者可以 在子类中重写此方法以对每个子类采取特定操作 错误,例如将消息插入日志文件或将其打印到 控制台。
事实上,事实上,org.xml.sax.ErrorHandler的界面已经记录在案:
警告:如果应用程序未注册ErrorHandler,则为XML 除了SAXParseExceptions之外,解析错误将不会被报告 被抛出致命的错误。为了检测有效性错误, 必须使用error()调用执行某些操作的ErrorHandler 注册
source code的SAX samples included with Xerces2-J在这方面提供了很好的例子。特别是,Counter
class显示了如何扩展DefaultHandler
。