Ich versuche, in javaXML-Validierung in Java mit schema eine lokale Datei andernfalls
Eingabedatei temp.xml einige XML gegen eine relative XSD-Datei zu überprüfen:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<tagname:b
xmlns:tagname="http://my_namespace.org/v1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://my_namespace.org/v1 ./local_xsd_file.xsd">
</tagname>
java Quelle:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
DocumentBuilder builder = factory.newDocumentBuilder();
builder.setErrorHandler(new RaiseOnErrorHandler());
builder.parse(new InputSource(new FileInputStream(filename)));
public static class RaiseOnErrorHandler implements ErrorHandler {
public void warning(SAXParseException e) throws SAXException {
throw new RuntimeException(e);
}
public void error(SAXParseException e) throws SAXException {
throw new RuntimeException(e);
}
public void fatalError(SAXParseException e) throws SAXException {
throw new RuntimeException(e);
}
}
Die lokale Datei local_xsd_file.xsd
existiert und scheint nicht gelesen zu werden.
Fehlermeldung
java.lang.RuntimeException: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 85; schema_reference.4: Failed to read schema document './local_xsd_file.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
at org.XX$RaiseOnErrorHandler.warning(DigitalFileWriterTest.java:1114)
at org.apache.xerces.util.ErrorHandlerWrapper.warning(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.reportSchemaWarning(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.getSchemaDocument(Unknown Source)
at org.apache.xerces.impl.xs.traversers.XSDHandler.parseSchema(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaLoader.loadSchema(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.findSchemaGrammar(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
... 50 more
Ich habe auch versucht file://local_xsd_file.xsd
und file://./local_xsd_file.xsd
mit (welche should sein possible) als schemaLocation
, alle mit dem gleichen Ergebnis. Wenn ich einen "absoluten Pfad" wie file:///full/path/to/local_xsd_file.xsd
verwende, dann funktioniert es. Wenn ich eine URL für den Speicherort des Schemas verwende, liest es sie von diesem Server und funktioniert gut.
Wenn ich mein aktuelles Arbeitsverzeichnis so ändere, dass es eine Datei local_xsd_file.xsd gibt, wird es funktionieren. Scheinbar funktioniert das aber nur relativ zu Ihrem aktuellen Arbeitsverzeichnis?
Ist es möglich, einen relativen Pfad mit Validierung in Java zu verwenden? Es fühlt sich vielleicht wie ein Implementierungsdetail an?
Schön gemacht, danke! – rogerdpack