如何解释SaxParseException(cvc-pattern-valid)?

时间:2012-02-14 16:30:00

标签: java xml exception-handling sax

使用xs:pattern处理xs:simpleType的xml-data验证错误的最佳方法是什么?

e.g。对

进行验证
<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保存此信息。解析器有一些状态,但我找不到我需要的信息。

1 个答案:

答案 0 :(得分:1)

您可以编写自己的错误处理程序并使用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);
        }
    }
}