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 правильно. Посоветуйте что-нибудь?

EDIT

Я последовал идее 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 являются нулевыми, я не могу продолжить расследование того, что вызывает исключение, пока я не разберу исключение, о чем я и просил изначально.

12
задан Thang Pham 21 December 2011 в 16:37
поделиться