Hallo,
vielleicht kann mir jemand helfen: Ich habe folgendes Problem:
Ich habe eine ZIP-Datei, welche zwei Dateien enthält: eine metadata.xml und eine metadata.xsd.
Aufgabe: Ich muss metadata.xml gegen metadata.xsd validieren. Ich verwende dafür JDOM (Version 2.0.0).
Wenn ich versuche, metadata.xml "direkt in der ZIP-Datei" zu validieren, erhalte ich eine Fehlermeldung, die lautet: cvc-elt.1: Cannot find the declaration of element <element-name>.
Entpacke ich die ZIP-Datei und validiere ich so, dann läuft die Validierung korrekt ab, d.h. der SAXBuilder erkennt die metadata.xml Date als valid. Nachfolgend der Code:
Inline-Validierung:
Der Stacktrace lautet:
Dieselben metadata.xml und metadata.xsd entpackt:
funktioniert.
Kann mir jemand einen Hinweis geben? Vielen Dank!
vielleicht kann mir jemand helfen: Ich habe folgendes Problem:
Ich habe eine ZIP-Datei, welche zwei Dateien enthält: eine metadata.xml und eine metadata.xsd.
Aufgabe: Ich muss metadata.xml gegen metadata.xsd validieren. Ich verwende dafür JDOM (Version 2.0.0).
Wenn ich versuche, metadata.xml "direkt in der ZIP-Datei" zu validieren, erhalte ich eine Fehlermeldung, die lautet: cvc-elt.1: Cannot find the declaration of element <element-name>.
Entpacke ich die ZIP-Datei und validiere ich so, dann läuft die Validierung korrekt ab, d.h. der SAXBuilder erkennt die metadata.xml Date als valid. Nachfolgend der Code:
Inline-Validierung:
Java:
public static void main(String[] args)
{
try
{
String zip = "U:/Incubator Projekte/Test/test.zip";
File file = new File(zip);
ZipFile zipFile = new ZipFile(file);
ZipEntry xmlEntry = zipFile.getEntry("header/metadata.xml");
InputStream in = zipFile.getInputStream(xmlEntry);
File xml = File.createTempFile("tmp_", ".xml");
OutputStream out = new FileOutputStream(xml);
while (in.available() > 0)
{
byte[] b = new byte[in.available()];
int n = in.read(b);
out.write(b, 0, n);
}
out.close();
in.close();
ZipEntry xsdEntry = zipFile.getEntry("header/metadata.xsd");
in = zipFile.getInputStream(xsdEntry);
File xsdFile = File.createTempFile("tmp_", ".xsd");
out = new FileOutputStream(xsdFile);
while (in.available() > 0)
{
byte[] b = new byte[in.available()];
int n = in.read(b);
out.write(b, 0, n);
}
out.close();
in.close();
XMLReaderXSDFactory xsdFactory = new XMLReaderXSDFactory(xsdFile);
SAXBuilder builder = new SAXBuilder(xsdFactory);
builder.setFeature("http://apache.org/xml/features/validation/schema", true);
Document document = builder.build(xml);
System.out.println(document);
}
catch (JDOMException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
Der Stacktrace lautet:
Java:
org.jdom2.input.JDOMParseException: Error on line 2 of document file:///C:/Dokumente%20und%20Einstellungen/ceugster/Lokale%20Einstellungen/Temp/tmp_3203038574951862036.xml: cvc-elt.1: Cannot find the declaration of element 'siardArchive'.
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:228)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:329)
at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1256)
at test.jdom.Main.main(Main.java:55)
Caused by: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'siardArchive'.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217)
... 3 more
Dieselben metadata.xml und metadata.xsd entpackt:
Java:
public static void main(String[] args)
{
try
{
String xml = "U:/Incubator Projekte/SIARD.val/Test Data/gebaeudeversicherung/header/metadata.xml";
String xsd = "U:/Incubator Projekte/SIARD.val/Test Data/gebaeudeversicherung/header/metadata.xsd";
XMLReaderXSDFactory xsdFactory = new XMLReaderXSDFactory(xsd);
SAXBuilder builder = new SAXBuilder(xsdFactory);
builder.setFeature("http://apache.org/xml/features/validation/schema", true);
Document document = builder.build(xml);
System.out.println(document);
}
catch (JDOMException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
funktioniert.
Kann mir jemand einen Hinweis geben? Vielen Dank!