对于带有xs:pattern的xs:simpleType,处理xml数据验证错误的最佳方法是什么?
例如针对的验证
<xs:simpleType name="IBANIdentifier">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}"/>
</xs:restriction>
</xs:simpleType>
将导致此SaxParseException:
org.xml.sax.SAXParseException: cvc-pattern-valid: Value 'XXAA99999999999911' is
not facet-valid with respect to pattern '[a-zA-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}
for type 'IBANIdentifier'.
在我的DefaultHandler.error()中,我如何访问
- 模式
- 实际值
- 简单类型的名称
而不分析错误消息
例外情况不以结构化形式(AFAIKS)保存此信息。解析器有一些状态,但我找不到我需要的信息。
您可以通过编写自己的错误处理程序并使用validator.setErrorHandler(new CollectingErrorHandler(errors, shouldConsiderWarningsAsErrors));
向Validator注册来捕获所有验证错误/警告
CollectingErrorHandler
现在可以访问所有验证错误。现在,还没有报告这些错误的标准格式,并且可能会随着解析器的实现而改变。因此,坚持使用一个解析器实现,并使用正则表达式进行解析。
public final class CollectingErrorHandler implements ErrorHandler
{
private final List<SAXException> l;
private final boolean warningsAreErrors;
public CollectingErrorHandler(final List<SAXException> l, final boolean shouldConsiderWarningsAsErrors)
{
this.l = l;
warningsAreErrors = shouldConsiderWarningsAsErrors;
}
public void error(final SAXParseException e)
{
l.add(e);
}
public void fatalError(final SAXParseException e)
{
l.add(e);
}
public void warning(final SAXParseException e)
{
if (warningsAreErrors)
{
l.add(e);
}
}
}