xsd validation with xsd files with dependencies ("schemalocation")

CJChico

Mitglied
Hi,

ich habe eine xsd validierung geschrieben die auch funktioniert, nun möchte sich erweitern das ich auch xsd schema validieren kann die Abhänigkeiten zu anderen xsd files hat. Hat das schon jemand mal gemacht?

so sieht meine momentane validierung aus, die leider nicht klappt, wenn ich mehrer xsd files habe:
Code:
public XMLParserWithXSD(File xsdFile, Object... objects) {
    this.xsdFile = xsdFile;
    this.additionalXsdFiles = new ArrayList<File>();
    if(objects != null && objects.length > 0) {
        for (Object object : objects) {
                if(object instanceof List) {
                    additionalXsdFiles.addAll((List<File>)object);
                }
            }
        }
        initialize();
    }
 
    private void initialize() {
    // setup xsd file
    if (xsdFile == null) {
        return;
    }
 
    // setup document builder
    factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    factory.setValidating(true);
    factory.setAttribute(KEY_SCHEMA_LANGUAGE, VALUE_SCHEMA);
    factory.setAttribute(KEY_SCHEMA_SOURCE, xsdFile);
    if(!additionalXsdFiles.isEmpty()) {
        File[] files = new File[additionalXsdFiles.size()+1];
        files[0] = xsdFile;
        int i = 1;
        for(File file : additionalXsdFiles) {
            files[i] = file;
            i++;
        }
        factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLocation", files);
    }
 
    try {
        builder = factory.newDocumentBuilder();
    } catch (ParserConfigurationException e) {
        logger.error(e);
        return;
    }
 
    builder.setErrorHandler(getParserErrorHandler());
    }
 
public void doParse(Elemet element, IDocument document) {
    if (builder == null) {
        return; // exception already handled by initialize()
    }
 
    this.element = element;
    this.document = document;
 
    try {
        IFile esFile = element.getElementFile();
        if (esFile != null
            && esFile.findMarkers(XMLErrorHandler.ERROR_MARKER_ID, true, IResource.DEPTH_ZERO).length > 0) {
        esFile.deleteMarkers(XMLErrorHandler.ERROR_MARKER_ID, true, IResource.DEPTH_ZERO);
        element.setValid(true);
        }
    } catch (CoreException e) {
        logger.error(e);
    }
 
    try {
        builder.parse(new InputSource(new StringReader(document.get())));
    } catch (SAXParseException e) {
        logger.error(e);
    } catch (SAXException e) {
        logger.error(e);
    } catch (IOException e) {
        logger.error(e);
    }
}

mfg
CJChico
 
ich habe mein problem gelösst bekommen.

hier ist die Lösung:
Code:
if(!additionalXsdFiles.isEmpty()) {
        String[] files = new String[additionalXsdFiles.size()+1];
        files[0] = xsdFile.getURI().toString;
        int i = 1;
        for(File file : additionalXsdFiles) {
            files[i] = file.getURI().toString;
            i++;
        }
        factory.setAttribute(KEY_SCHEMA_SOURCE, files);
}
 
Zuletzt bearbeitet:

Zurück
Oben