如何分解SaxParseException(cvc模式有效)



对于带有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);
        }
    }
}

最新更新