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