Подтвердить что ты не робот

JAXB: при использовании XML-схемы (.xsd) для проверки XML файла, если проверка не выполняется, могу ли я узнать, какой XML-тег вызывает ее?

так что прямо сейчас, когда я проверяю XML файл с помощью схемы XML, я могу только узнать, сбой или пропуск, и если я хочу знать, почему это не удается, мне нужно посмотреть сообщение об ошибке, например

[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'City'. One of '{Address1}' is expected.]

В приведенном выше примере он терпит неудачу, потому что мне не хватает тега Address1. Мой вопрос: Когда проверка завершена, могу ли я узнать, какой тег вызывает сбой? Это потому, что мне нужно обрабатывать эти ошибки по-разному для каждого важного отсутствующего тега. Прямо сейчас моя мысль

FileInputStream inputStream = null;
try{
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(new File(config.getXmlSchema()));
    JAXBContext context = JAXBContext.newInstance(PackageLabel.class);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    unmarshaller.setSchema(schema);
    inputStream = new FileInputStream(xmlFile);
    pl = (PackageLabel) unmarshaller.unmarshal(inputStream);
} catch (JAXBException e) {
    if(pl.getAddress1() == null){
         System.out.println("Invalid Mailing Address");
    }
    //EDIT: CANNOT DO THIS, SINCE pl  IS NULL AT THIS POINT
    //Some more logics on how to handle important missing-tags
    ...
}finally{
    if(inputStream != null) inputStream.close();
}  

Однако, я не думаю, что написать логику внутри catch clause правильно. Любой совет?

ИЗМЕНИТЬ

Я последовал за идеей Balaise, а ниже - это событие, которое я получил, когда XML отсутствовал Address1

EVENT
SEVERITY:  2
MESSAGE:  cvc-complex-type.2.4.a: Invalid content was found starting with element 'City'. One of '{Address1}' is expected.
LINKED EXCEPTION:  org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'City'. One of '{Address1}' is expected.
LOCATOR
 LINE NUMBER:  4
 COLUMN NUMBER:  11
 OFFSET:  -1
 OBJECT:  null
 NODE:  null
 URL:  null

Однако, как NODE, так и OBJECT являются нулевыми, я не могу продолжить исследование того, что вызывает исключение, если я не разобрал исключение, из которого я первоначально спросил.

4b9b3361

Ответ 1

Вы можете использовать JAXB ValidationEventHandler для этого. Затем реализацию можно установить на экземплярах Marshaller и Unmarshaller:

package blog.jaxb.validation;

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;

public class MyValidationEventHandler implements ValidationEventHandler {

    public boolean handleEvent(ValidationEvent event) {
        System.out.println("\nEVENT");
        System.out.println("SEVERITY:  " + event.getSeverity());
        System.out.println("MESSAGE:  " + event.getMessage());
        System.out.println("LINKED EXCEPTION:  " + event.getLinkedException());
        System.out.println("LOCATOR");
        System.out.println("    LINE NUMBER:  " + event.getLocator().getLineNumber());
        System.out.println("    COLUMN NUMBER:  " + event.getLocator().getColumnNumber());
        System.out.println("    OFFSET:  " + event.getLocator().getOffset());
        System.out.println("    OBJECT:  " + event.getLocator().getObject());
        System.out.println("    NODE:  " + event.getLocator().getNode());
        System.out.println("    URL:  " + event.getLocator().getURL());
        return true;
    }

}

Дополнительная информация

Ответ 2

Может работать (я еще не закодировал его). Вы можете создать StAX XMLStreamReader на вашем XML-входе. Затем отмените его, используя Unmarshaller с установленным на нем Schema, чтобы включить проверку. При возникновении ошибки отменяется разблокировка. Затем вы можете проверить, какое событие имеет XMLStreamReader, чтобы увидеть, где произошла ошибка.

Ответ 3

Не существует хорошо сформированного решения, которое вы запрашиваете через JAXB. JAXB предоставляет поддержку для проверки исходного xml-кода на схему, которая работает - true или false. Понятие состоит в том, что если xml недействителен, вы не должны продолжать дальше.