gpt4 book ai didi

java - 使用 javax.xml.validation.Validator 针对 XSD 进行 XML 验证

转载 作者:行者123 更新时间:2023-12-01 04:15:22 25 4
gpt4 key购买 nike

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;
}

有人知道可能缺少什么来告诉 validator 考虑属性的限制吗?

我没有使用 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()方法:

The default implementation does nothing. Application writers may override this method in a subclass to take specific actions for each error, such as inserting the message in a log file or printing it to the console.

总的来说,其实接口(interface)为org.xml.sax.ErrorHandler记录如下:

WARNING: If an application does not register an ErrorHandler, XML parsing errors will go unreported, except that SAXParseExceptions will be thrown for fatal errors. In order to detect validity errors, an ErrorHandler that does something with error() calls must be registered.

source code对于 SAX samples included with Xerces2-J提供该领域的良好范例。特别是Counter class展示如何扩展 DefaultHandler

关于java - 使用 javax.xml.validation.Validator 针对 XSD 进行 XML 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19499362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com