Общий валидатор XML-файла по XML-схеме (XSD-файл) - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу создать универсальный xmlFileValidator с JAXB, который принимает файл XML и файл схемы и возвращает объект корневого класса, если файл допустим, иначе выдает исключение SAXException или JAXBException.

public class XmlValidateEventHandler implements ValidationEventHandler {
public static <E> void validator(File xsdFile, File xmlFile, E obj) throws SAXException, JAXBException
{
    JAXBContext jaxbcontextobj = JaxbUtil.create_context_obj(new ObjectFactory());
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(xsdFile);
    Unmarshaller unmarshaller = JaxbUtil.create_unmarshl_obj(jaxbcontextobj);

    unmarshaller.setSchema(schema);
    unmarshaller.setEventHandler(new XmlValidateEventHandler());        
    javax.xml.bind.JAXBElement<Document>  doc = (javax.xml.bind.JAXBElement<Document>) unmarshaller.unmarshal(xmlFile);
    Document d = doc.getValue();
    obj=(E)d;
}

@Override
public boolean handleEvent(ValidationEvent event) {

    Logger logger = utility.JaxbUtil.getLogger();
    if(event.getSeverity() == ValidationEvent.ERROR || event.getSeverity() == ValidationEvent.FATAL_ERROR)
    {                           
        //Logger logger = Logger.getLogger(XmlValidateEventHandler.class);              
        logger.error("SEVERITY:  " + event.getSeverity());          
        logger.error("MESSAGE:  " + event.getMessage());            
        logger.error("LINKED EXCEPTION:  " + event.getLinkedException());           
        logger.error("LINE NUMBER:  " + event.getLocator().getLineNumber());
        logger.error("COLUMN NUMBER:  " + event.getLocator().getColumnNumber());
        logger.error("***** Give XML is invalid aginst given XSD *****");
        return false;
    }   
}

}

Следующая строка выдает предупреждение ->

Тип безопасности: Не проверено приведение от объекта к JAXBElement

javax.xml.bind.JAXBElement<Document>  doc=(javax.xml.bind.JAXBElement<Document>) unmarshaller.unmarshal(xmlFile);

И я также не могу отобразитьнемаршализованный объект и установите его в E obj , который передается в качестве аргумента.Я знаю, что он может вернуться, но меня попросили установить его в этот параметр.Пожалуйста помоги.Заранее спасибо

1 Ответ

0 голосов
/ 12 сентября 2018

Я изменил на следующее, и это работает:

    public static <E> E validator(File xsdFile, File xmlFile, E obj) throws SAXException, JAXBException
{   
    JAXBContext jaxbcontextobj = JaxbUtil.setContextObj(new ObjectFactory());
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(xsdFile);
    Unmarshaller unmarshaller = JaxbUtil.setUnmarshlObj(jaxbcontextobj);

    unmarshaller.setSchema(schema);
    unmarshaller.setEventHandler(new XmlValidateEventHandler());        
    javax.xml.bind.JAXBElement<E>  doc = (javax.xml.bind.JAXBElement<E>) unmarshaller.unmarshal(xmlFile);
    E d = (E) doc.getValue();
    return d;
}

Но теперь есть еще открытые концы: 1. Я все еще не могу сопоставить объект с третьим параметром -> E obj 2. Я использую ObjectFactory из классов, сгенерированных JAXB:

import XmlClasses.ObjectFactory;

Что все еще делает его не полностью универсальным, как взять универсальный ObjectFactory ??

...