Как разобрать SaxParseException (cvc-pattern-valid)? - PullRequest
1 голос
/ 14 февраля 2012

Каков наилучший способ обработки ошибок проверки xml-данных по xs: simpleType с шаблоном xs:

, например, проверка по

<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 () как я могу получить доступ к шаблону

  • фактическое значение
  • имя простого типа

без анализа ошибки-msg?

Исключение не содержит эту информацию в структурированной форме, AFAIKS.У парсера есть состояние, но я не могу найти нужную мне информацию.

1 Ответ

1 голос
/ 14 февраля 2012

Вы можете зафиксировать все ошибки / предупреждения проверки, написав свой собственный обработчик ошибок и зарегистрировавшись в Validator, используя validator.setErrorHandler(new CollectingErrorHandler(errors, shouldConsiderWarningsAsErrors));

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