2014-08-30 2 views
1

Я хочу проверить файл xml с его xsd перед его unmarshalling.JAXB Validator не обнаруживает синтаксические ошибки?

Код выглядит следующим образом:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = factory.newSchema(xsdFilePath); 
Validator validator = schema.newValidator(); 
validator.setErrorHandler(new MyValidationErrorHandler()); 
validator.validate(new StreamSource(xmlFilePath)); 

Я обнаружил, что, когда XML-элемент не закрыт, валидатор не удалось записать это как ошибку, Но UnMarshaller признает это и бросает «Invalid контент был обнаружен начиная с элемента .. "Ошибка.

Я хочу, чтобы проверка и развязка/Маршаллинг были разными.

Существуют ли способы проверки Validator таких синтаксических ошибок в файле xml?

ответ

1

Вы должны различать две вещи:

  1. Элементарный синтаксис документа XML
  2. Соблюдение документа с XML Schema

Если элементарный синтаксис не прав , нет документа, который может быть исследован для его структуры элементов, атрибуции существования, соответствия ценности фасеткам и т. д. и т. д.

Боюсь, вам придется поймать оба вида исключений.

Вы можете, однако, обрабатывать все в одном немаршалинге операции:

JAXBContext payloadContext = JAXBContext.newInstance("generated"); 
Unmarshaller unmarshaller = payloadContext.createUnmarshaller(); 
unmarshaller.setSchema(schemaFactory.newSchema(...));); 
unmarshaller.setEventHandler(new ValidationEventHandler(){ 
    public boolean handleEvent(ValidationEvent event) { 
      System.out.println("Event! " + event); 
      return true; 
    } 
}); 

Позже

Чтобы иметь только подтверждение, вы все равно придетесь разобрать, но если вы этого не сделаете имеют JAXB-иш классов, вы получите, с JAXP:

static class Handler implements ErrorHandler { 
    public void error(SAXParseException exception){ 
    System.out.println("error: " + exception.getMessage()); 
    } 
    public void fatalError(SAXParseException exception){ 
    System.out.println("fatal: " + exception.getMessage()); 
    } 
    public void warning(SAXParseException exception){ 
    System.out.println("warning: " + exception.getMessage()); 
    } 
} 

Handler handler = new Handler(); 
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
parser.setErrorHandler(handler); 
try { 
    Document document = parser.parse(new File("test.xml")); 
    SchemaFactory factory = 
     SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Source schemaFile = new StreamSource(new File("test.xsd")); 
    Schema schema = factory.newSchema(schemaFile); 
    Validator validator = schema.newValidator(); 
    validator.setErrorHandler(handler); 
    try { 
     validator.validate(new DOMSource(document)); 
    } catch (SAXException e) { 
     // ... 
     System.out.println("VAlidation error"); 
    } 
} catch (SAXParseException e) { 
    // syntax error in XML document  
    System.out.println("Syntax error"); 
} 

Для проверки, установив обработчик не будет бросать ParseException, так о ne из них избыточно.

+0

Причина, по которой я хочу продолжать проверку и разборки отдельно, заключается в том, что я хочу, чтобы валидация была как можно более общей, без большой зависимости от JAXBContext, поскольку она будет повторно использоваться в нескольких местах для проверки XML-файлов. Я хочу иметь API проверки подлинности, который будет сообщать об ошибках синтаксиса/разбора в XML-файле, а также об ошибках соответствия схемы. – Monikka

Смежные вопросы