как сделать проверку с не очень хорошей формой XML при выполнении демаршаллинга? - PullRequest
1 голос
/ 23 марта 2011

У меня есть демаршаллер вместе с файлом MySchema.xsd.

    StreamSource sources = new StreamSource(getClass().getClassLoader().getResourceAsStream("/xmlValidation.xsd"));
    SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
    unmarshaller.setSchema(sf.newSchema(sources));

И вызовите функцию unmarshaller.setEventHandler (), чтобы указать пользовательский обработчик события проверки, который в основном форматирует строку с подсказками об ошибках, путем:

    final String errorString = new String();
    unmarshaller.setEventHandler(new ValidationEventHandler() {
        @Override
        public boolean handleEvent(ValidationEvent validationevent) {
            if(validationevent.getSeverity()!= ValidationEvent.WARNING){
                errorString.format( "Line:Col[" + validationevent.getLocator().getLineNumber()
                                    + ":" + validationevent.getLocator().getColumnNumber()
                                    + "]:" + validationevent.getMessage());
                return false;
            }
            return true;
        }
    });

Вышеприведенные коды работают нормально (я могу получить объект Java, когда проверена входная строка, а также строка с подсказками об ошибках отформатирована как исключенная)

Проблема заключается в том, что, когда входной xml не имеет правильной формы, он также генерирует исключение SaxParseException.

Заранее спасибо. Andrew

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Правильно сформированный относится к самому синтаксису XML, в отличие от того, чтобы быть действительным WRT схемы XML:

Если у вас есть XML, который не правильно сформирован, вы получите ValidationEvent.FATAL_ERROR, и unmarshalling не сможет продолжаться, так как базовый синтаксический анализатор, используемый JAXB, не может продолжаться.

Для получения дополнительной информации:

0 голосов
/ 23 марта 2011

К, я что-то напутал и получил эту проблему.Теперь я это понимаю.Если я ошибаюсь, пожалуйста, укажите мне.ниже это то, что я нахожу в javadoc и тестирую в моем проекте:

javax.xml.bind.ValidationEventHandler может обрабатывать ошибку ограничений с помощью заданных ограничений схемы, когда unmarshaller не демарширует.

unmarshaller.unmarshal(xmlInputStream);

ValidationEventHandler будет вызываться во время процесса демаршалирования в случае возникновения ошибки.SAXEception будет сгенерирован, если xmlInputStream не является правильной формой.И я не могу найти способ перехватить SAXException, выдаваемый синтаксическим анализатором саксофона, поэтому я предполагаю, что использование проверки во время unmarshaling не может быть связано с некорректной формой XML-строки.


Я использую javax.xml.validation.Validator для проверки правильности формы XML-строки и ее ограничения.

jaxbValidator.validate(xmlSource);

Приведенный выше код вызовет SAXException.Если исключение не выдается, удалите строку xml в объект.

...