2017-11-13 1 views
0

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?

Antwort

1

Wenn Sie bauen ein Dokument wie folgt aus:

DocumentBuilder builder = factory.newDocumentBuilder(); 
builder.setErrorHandler(new RaiseOnErrorHandler()); 
builder.parse(new InputSource(new FileInputStream(filename))); 

der Basis-URI des Dokuments nicht bekannt ist (weil der Bauherr sieht nur eine InputStream und hat keine Möglichkeit herauszufinden, dass dies eine besondere liest Datei). Versuchen Sie, eines der parse()-Verfahren zu verwenden, aus denen ein Basis-URI eingerichtet werden kann, z. parse(file.toString()) oder saxParser.parse(file, (DefaultHandler) null);.

Ohne einen Basis-URI gibt es keine vernünftige Methode zum Auflösen eines relativen URI. Das System verwendet möglicherweise das aktuelle Verzeichnis (das hier anscheinend auftritt) oder meldet möglicherweise einen Fehler.

+0

Schön gemacht, danke! – rogerdpack