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

darksmilie

Erfahrenes 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
Darksmilie
 
ich 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);
}
 
Zurück